# CarND Term1 Project 5 - Vehicle detection

Goal: The goal of this project is to detect vehicles on road following techniques thought in Project 5 of Term1. Here is breif description of steps followed: 0) Read input and check if the input for training is appropriate - Understand input. 1) Do color schems for feature extraction. 2) Perform Histogram of Oriented gradients (HOG) feature extraction on labeled vehicles and non-vehicles. http://scikit-image.org/docs/dev/auto_examples/features_detection/plot_hog.html#id3 3) Perform Spatial binding feature extraction. 4) Perform histogram of colors and extract features. 5) Combine all features and perform normalization of data. 6) Randomize data and extract Train and test features. 7) Perform training using Linear SVM classifier. 8) On test images perform sliding window technique with variying sizes of windows to capture all vehicles. 9) Predict vehicle regions and eliminate false positives and noise using heat map and labelling. 10) Run pipe line for project and test videos. 11) Extra: Add lane detection to pipeline and perform lane and vehicle detection.
In [37]:
import os

import cv2
import glob
import numpy as np
import pdb
import pickle
import random
import skimage
import sklearn
import time
import threading

# Specific imports.
from collections import deque
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
from multiprocessing import Queue
from scipy.ndimage.measurements import label
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from skimage.feature import hog

# video processing
from moviepy.editor import VideoFileClip
%matplotlib inline
In [2]:
# Plot images utility.
def plot_images(imgs, labels, rows=1, cols=3):
    """ 
    Plot images in rowXcol format.
    imgs: List of images to display.
    lables: List of lables for the images to display
    """
    display_imgs = imgs
    display_labels = labels
    fig, axis = plt.subplots(nrows=rows, ncols=cols, figsize=(20, 20))
    axis = axis.ravel()
    for index in range(len(display_imgs)):
        img = display_imgs[index]
        if ((not isinstance(img, tuple)) and
            (len(img.shape) == 3 and img.shape[2] == 1)):
            img = np.squeeze(img, axis=(2,))

        axis[index].imshow(img, cmap='gray')
        axis[index].set_title(display_labels[index], fontsize=20)
    plt.tight_layout()
In [3]:
# Load training images.

def get_all_files(base_path, f_type="*.jpeg"):
    "Return a list of files of given type."
    files = []
    glob_path = base_path + "/**/" + f_type
    for fname in glob.glob(glob_path, recursive=True):
        files.append(fname)
    return files

car_files = []
non_car_files = []

car_files = get_all_files("../vehicles", "*.png")
non_car_files = get_all_files("../non-vehicles", "*.png")

# Shuffle input data.
car_files = sklearn.utils.shuffle(sklearn.utils.shuffle(car_files))
non_car_files = sklearn.utils.shuffle(sklearn.utils.shuffle(non_car_files))
In [4]:
# Test and view some images.
print("Overall car files:", len(car_files))
print("Overall of non-car files:", len(non_car_files))
Overall car files: 8792
Overall of non-car files: 8968
In [5]:
# Display Car and Non-car images.
display_imgs = []
display_labels = []
for i in range(3):
    img = mpimg.imread(car_files[i])
    display_imgs.append(img)
    display_labels.append("Car")
for i in range(3):
    img = mpimg.imread(non_car_files[i])
    display_imgs.append(img)
    display_labels.append("Non Car")
    
print("Image shape", img.shape)
plot_images(display_imgs, display_labels, rows=2, cols=3)
Image shape (64, 64, 3)
In [6]:
# Create a image parameter class to hold feature parameters.
# ATM, no methods but most of these could be changed using members.
class Feature_Params():
    """ Image feature parameter object."""
    def __init__(self):
        """ Initialize all params to default values."""
        # used for color spacing parameter; This seem effective overall.
        self.color_space = "YCrCb"
        # Final image size which is used to extract features.
        self.req_size = (32, 32)
        # HOG orient parameter.
        self.orient = 9
        # HOG pix_per_cell param
        self.pix_per_cell = (8, 8)
        # HOG cell_per_block
        self.cells_per_block = (2, 2)
        # Visualize HOG features
        self.hog_vis = False
        # Ravel before returning HOG
        self.feature_vec = True  
        # For color histograms
        self.nbins = 32
        # Range of bins; This could very well be detected. For now constant.
        self.bins_range = (0, 256)


        # Training Test data sets.
        self.X_train = None
        self.y_train = None
        self.X_test = None
        self.y_test = None
        self.X_scaler = None
        # Ref to classifier.
        self.svc = None
        
        self.heat_threshold = 2
In [7]:
def get_color_space(img, feature_params):
    """ Returns the requested color space other than RGB. """
    # Convert image to new color space (if specified)
    # Ref: https://chatbotslife.com/vehicle-detection-and-tracking-using-computer-vision-baea4df65906
    #   YcrCB
    # Along with some simple testing on images.
    assert feature_params, " Image feature object is empty."
    
    color_space = feature_params.color_space
    if color_space != 'RGB':
        if color_space == 'HSV':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
        elif color_space == 'LUV':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2LUV)
        elif color_space == 'HLS':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2HLS)
        elif color_space == 'YUV':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2YUV)
        elif color_space == 'YCrCb':
            feature_image = cv2.cvtColor(img, cv2.COLOR_RGB2YCrCb)
    else: 
        feature_image = np.copy(img) 
    return feature_image
In [8]:
# Exploring color space. 

def bin_spatial(img, feature_params):
    """ Takes an image and requested color_space,  converts
    it to the requested space and returns a 1 dimension
    feature vector.
    """
    assert feature_params, "Feature parameter is empty."
    
    size = feature_params.req_size
    # Apply to all channels, not much of difference.
    features = cv2.resize(img, size).ravel() 
    return features
In [9]:
# Get Histogram Orientation of Gradients (HOG) of image.
def get_hog_features(img, feature_params):
    """ Returns HOG features of an image.
    http://scikit-image.org/docs/dev/auto_examples/features_detection/plot_hog.html#id3
    """
    
    assert feature_params, "Feature parameter is empty."
    fp = feature_params
    if fp.hog_vis:
        features, hog_image = hog(img, orientations=fp.orient,
                            pixels_per_cell= fp.pix_per_cell,
                            cells_per_block= fp.cells_per_block, 
                            transform_sqrt=False,
                            visualise=fp.hog_vis,
                            feature_vector=fp.feature_vec)
    
        return features, hog_image
    else:
        features = hog(img, orientations=fp.orient,
                            pixels_per_cell= fp.pix_per_cell,
                            cells_per_block= fp.cells_per_block, 
                            transform_sqrt=False,
                            visualise=fp.hog_vis,
                            feature_vector=fp.feature_vec)
        return features

def get_all_hog_features(img, feature_params):
    """ Returns combined HOG features of different channels in an image."""
    
    combined = []
    for channel in range(img.shape[2]):
        n_img = img[:,:,channel]
        combined.append(get_hog_features(n_img, feature_params))
    return np.ravel(combined)
In [10]:
# Compute color histograms.
def color_histogram(img, feature_params):
    """ Returns a combined histogram of features of all color channels.
    Assumes image to be in RGB.
    """
    assert feature_params, "Feature parameter is empty."
    nbins = feature_params.nbins
    bins_range = feature_params.bins_range
    # Compute the histogram of the color channels separately
    channel1_hist = np.histogram(img[:,:,0], bins=nbins, range=bins_range)
    channel2_hist = np.histogram(img[:,:,1], bins=nbins, range=bins_range)
    channel3_hist = np.histogram(img[:,:,2], bins=nbins, range=bins_range)
    
    # Concatenate the histograms into a single feature vector
    features = np.concatenate((channel1_hist[0], 
                            channel2_hist[0], channel3_hist[0]))
    return features
In [11]:
# Get indivijual feature maps. When parsing images in video 
# features need to be applied only to region/rectangle. HOG features
# are applied on all the image and indivijual HOG is applied  for rectangle.

def get_image_features(img, fp, is_sliding_w=False):
    """ Return combined features of input image. Image is to be
    in RGB.
    """
    
    f_img = img
    img_features = []
    
    if is_sliding_w:
        # If its a sliding window sub-image; color space and hog features
        # are done across image; prior to this call.
        spatial_features = bin_spatial(f_img, fp)
        color_hist_features = color_histogram(f_img, fp)
        # Combine features
        img_features.append(spatial_features)
        img_features.append(color_hist_features)
    else:
        # Preserve order of steps.
        # Get requested color space.
        f_img = get_color_space(img, fp)
        # Change the size of image.
        spatial_features = bin_spatial(f_img, fp)
        # Get HOG features for all channels.
        hog_features = get_all_hog_features(f_img, fp)
        # Get color histogram for all channels.
        color_hist_features = color_histogram(f_img, fp)

        img_features.append(spatial_features)
        img_features.append(color_hist_features)
        img_features.append(hog_features)
    return img_features
In [12]:
def extract_features(img_files, fp):
    """ Return combined feature vector of all training images.
    """
    features = []
    for file in img_files:
        img = mpimg.imread(file)
        file_features = np.concatenate(get_image_features(img, fp))
        features.append(file_features)
    return features
In [13]:
# Load a sample image to test various features.
car_file = "../vehicles/KITTI_extracted/13.png"
non_car_file = "../non-vehicles/GTI/image13.png"
test_file = "./test_images/test6.jpg"
test_img = mpimg.imread(test_file)
test_car = mpimg.imread(car_file)
test_non_car = mpimg.imread(non_car_file)

test_fp = Feature_Params()
test_fp.hog_vis = True
_, hog_car = get_hog_features(test_car[:,:,0], test_fp)
_, non_hog_car = get_hog_features(test_non_car[:,:,0], test_fp)
plot_images([test_car, hog_car, test_non_car, non_hog_car], 
            ["Original", "Car Hog", "Non car", "Non car Hog"],
            rows=2, cols=2)
# reset params.
test_fp.hog_vis = False
In [14]:
# Train test features.

def get_training_data(car_files, non_car_files, fp, force=False):
    """ 
    Return Training and test data sets from given a list of 
    car and non-car items. These values are also stored in feature
    parameter object.
    """
    assert fp, "Feature parameters is empty."
    original_features = None
    # This is costly unless some parameter is changed just return 
    # from previous calculations. Could be done better with
    # change in params.
    if not force:
        return fp.X_train, fp.y_train, fp.X_test, fp.y_test
    
    car_features = extract_features(car_files, fp)
    non_car_features = extract_features(non_car_files, fp)

    # Get training data
    X_train = np.vstack((car_features, non_car_features)
                   ).astype(np.float64) 
    original_features = X_train
    
    # Start Normalization.
    X_scaler = StandardScaler().fit(X_train)
    # Apply the scaler to X
    X_scaled = X_scaler.transform(X_train)

    # Define the labels vector; 1 for 'car' 0 for 'non-car'
    y = np.hstack((np.ones(len(car_features)),
               np.zeros(len(non_car_features))))

    # Now that we have X (train data) and y (labels); 
    # split few to test and possibly another shuffle.
    rand_state = np.random.randint(0, 100)
    fp.X_train, fp.X_test, fp.y_train, fp.y_test = \
            train_test_split(X_scaled, y, test_size=0.2,
                             random_state=rand_state)

    fp.X_scaler = X_scaler
    return original_features, fp.X_train, fp.y_train, fp.X_test, fp.y_test
In [15]:
# Linear Support vector machines.
# https://www.edvancer.in/logistic-regression-vs-decision-trees-vs-svm-part1/
# In this project, goal is to identify cars. Meaning everything else is non-car.
# so if there is a way to seperate cars from rest, we should be good.
# "SVM works by projecting your feature space into kernel space and making
# the classes linearly separable."
# I believe we do not need to classify complex features with-in car but general car features
# from given training set. To keep it simple, linearSVM will be applied.
# https://pdfs.semanticscholar.org/2ce0/664cfcb32461b900dd9e889cbbb2259c503e.pdf

def linear_svc(X_train, y_train, X_test, y_test):
    """ Trains input and returns SVC. 
    """

    # Kernel is linear as we intend to decide car/non-car.
    # C parameter: Tradeoff between smooth decision boundry vs better 
    # classification of training set.   
    c_param = 100.0
    svc = LinearSVC(C=c_param)
    # Calculate training time.
    t=time.time()
    svc.fit(X_train, y_train)
    t2 = time.time()
    print('Seconds to train SVC:', round(t2-t, 2))

    # Check the score of the SVC
    print('Test Accuracy of SVC:', round(svc.score(X_test, y_test), 4))
    
    return svc
In [39]:
# Test classifier.
fp = Feature_Params()
fp.feature_vec = True

orig_features, X_train, y_train, X_test, y_test = \
        get_training_data(car_files, non_car_files, fp, force=True)

print("Training Features:", len(X_train))
print("Test Features:", len(X_test))
    
svc = linear_svc(X_train, y_train, X_test, y_test)
fp.svc = svc
Training Features: 14208
Test Features: 3552
Seconds to train SVC: 7.0
Test Accuracy of SVC: 0.9882
In [17]:
# Examine raw features vs normalizaed feature set of test car.
raw_features = extract_features([car_file], fp)
raw_features = np.hstack(raw_features).reshape(1, -1)
raw = raw_features.ravel()

normalized_features = fp.X_scaler.transform(raw_features).ravel()
print(raw.shape)
print(normalized_features.shape)
# Plot an example of raw and scaled features; Ref: udacity.
fig = plt.figure(figsize=(12,4))
plt.subplot(131)
plt.imshow(test_car)
plt.title('Original Image')
plt.subplot(132)
plt.plot(raw)
plt.title('Raw Features')
plt.subplot(133)
plt.plot(normalized_features)
plt.title('Normalized Features')
fig.tight_layout()
(8460,)
(8460,)
In [18]:
# Take 10 samples and verify prediction.
n = 10
# Random shuffle data; start from 0.
actual_predicts = fp.svc.predict(X_test[0:n])
expected_predicts = y_test[0:n]
for i in range(n):
    print("Actual: %d Expected: %d" % (actual_predicts[i],
                                       expected_predicts[i]))
Actual: 1 Expected: 1
Actual: 1 Expected: 1
Actual: 0 Expected: 0
Actual: 0 Expected: 0
Actual: 0 Expected: 0
Actual: 0 Expected: 0
Actual: 0 Expected: 0
Actual: 1 Expected: 1
Actual: 0 Expected: 0
Actual: 0 Expected: 0
In [19]:
# Using sliding window find all window regions where a vehicle is detected.
def get_vehicle_regions(img, fp, y_low_high, scale=1.5):
    """
    Returns a list of rectangle co-ordinates for all regions where a vehicle
    is detected.
    Arguments:
    img: Original image.
    x_low_high : X region of interest in image (start, end).
    y_low_high : Y region of interest in image (start, end).
    svc : Trained classifier; support vector classifier.
    """ 
    rectangles = []
    ystart, ystop = y_low_high
    # Assuming x == y.
    pix_per_cell = fp.pix_per_cell[0]
    cells_per_block = fp.cells_per_block[0]
    
    # This assumes image has scaled to 255.
    draw_img = np.copy(img)
    img = img.astype(np.float32)/255
    
    img_to_search = img[ystart:ystop,:,:]
    cs_img = get_color_space(img_to_search, fp)
    if scale != 1:
        imshape = cs_img.shape
        cs_img = cv2.resize(cs_img, (np.int(imshape[1]/scale), 
                                     np.int(imshape[0]/scale)))
    ch1 = cs_img[:,:,0]
    ch2 = cs_img[:,:,1]
    ch3 = cs_img[:,:,2]

    # Define blocks and steps.
    nxblocks = (ch1.shape[1] // pix_per_cell) - cells_per_block + 1
    nyblocks = (ch1.shape[0] // pix_per_cell) - cells_per_block + 1 
    nfeat_per_block = fp.orient*cells_per_block**2
    
    # 64 was the orginal sampling rate, with 2 cells and 8 pix per cell
    window = 64
    nblocks_per_window = (window // pix_per_cell) - cells_per_block + 1
    cells_per_step = 2  
    nxsteps = (nxblocks - nblocks_per_window) // cells_per_step
    nysteps = (nyblocks - nblocks_per_window) // cells_per_step
    
    # Compute individual channel HOG features for the entire image
    hog1 = get_hog_features(ch1, fp)
    hog2 = get_hog_features(ch2, fp)
    hog3 = get_hog_features(ch3, fp)
    for xb in range(nxsteps):
        for yb in range(nysteps):
            ypos = yb*cells_per_step
            xpos = xb*cells_per_step
            
            # Extract HOG for this patch
            hog_feat1 = hog1[ypos:ypos+nblocks_per_window,
                             xpos:xpos+nblocks_per_window].ravel() 
            hog_feat2 = hog2[ypos:ypos+nblocks_per_window,
                             xpos:xpos+nblocks_per_window].ravel() 
            hog_feat3 = hog3[ypos:ypos+nblocks_per_window,
                             xpos:xpos+nblocks_per_window].ravel() 
            hog_features = np.hstack((hog_feat1, hog_feat2, hog_feat3))

            xleft = xpos*pix_per_cell
            ytop = ypos*pix_per_cell

            # Extract the image patch
            sub_img = cv2.resize(cs_img[ytop:ytop+window, 
                                        xleft:xleft+window], (window, window))
          
            # Get other features; (bin spatial & color histogram of region.)
            features = get_image_features(sub_img, fp, is_sliding_w=True) 
            features.append(hog_features)
            # Combine all.
            features = np.hstack(features).reshape(1, -1)
            # Scale features and make a prediction
            test_features = fp.X_scaler.transform(features)    
            test_prediction = fp.svc.predict(test_features)
            if test_prediction == 1:
                xbox_left = np.int(xleft*scale)
                ytop_draw = np.int(ytop*scale)
                win_draw = np.int(window*scale)
                rectangles.append(((xbox_left, ytop_draw+ystart),
                              (xbox_left+win_draw,ytop_draw+win_draw+ystart)))
                
    return rectangles
In [20]:
def draw_boxes(img, bboxes, color=(0, 255, 0), thick=4):
    """ Add boxes to given image and return new image.
    Boxes: rectangles shape ex:((top_left, bottm_right))
    """
    imcopy = np.copy(img)
    # Iterate through the bounding boxes
    for bbox in bboxes:
        # Draw a rectangle given bbox coordinates
        cv2.rectangle(imcopy, bbox[0], bbox[1], color, thick)
    return imcopy
In [21]:
# Test with single region.

# This is useful for sub-sampling. No ravel before returning HOG.
fp.feature_vec = False

img = test_img 
y_low_high = (375, 656)
scale = 1.5
boxes = get_vehicle_regions(img, fp, y_low_high, scale)
detected_img = draw_boxes(img, boxes)
plot_images([img, detected_img], ["Original", "Cars detected"], rows=1, cols=2)
In [22]:
def multi_scaled_window_search(orig_img, fp, group_size=False):
    """
    Return region of boxes identified for an image.
    group_size: Groups boxes according to scales.
    """
    y_low_highs = [(340, 656), (350, 656), (375, 656), (400, 656)]
    scales = [1.0, 1.5, 2.5, 3.5]
    # List of rectangular boxes identified with points (X, Y)
    final_boxes = []
    for w_params in zip(y_low_highs, scales):
        boxes = get_vehicle_regions(orig_img, fp, w_params[0], w_params[1])
        if group_size:
            final_boxes.append(boxes)
        else:
            final_boxes.extend(boxes)
    return final_boxes
        
# Find vehicles using different scales and intrest area of
# original input image.
def draw_multiscaled_windows(orig_img, fp, overlap_boxes=True):
    """
    Returns a list of images with various sliding widows detected.
    """
    # Final list of images to return.
    result_imgs = []
    # Different colors for various sizes.
    colors = [(0, 255, 0), (0, 0, 255),(255, 0, 0), (0, 0, 0), (255, 255, 255)]
    img = np.copy(orig_img)
    group_boxes = multi_scaled_window_search(orig_img, fp, group_size=True)
    colors = colors[:len(group_boxes)]
    
    for w_param in zip(group_boxes, colors):
        detected_img = draw_boxes(img, w_param[0], color=w_param[1])
        # Overlap rectangles on previous detection.
        if overlap_boxes:
            img = detected_img
        else:
            result_imgs.append(detected_img)
            
    # add the final overlap image.
    if overlap_boxes:
        result_imgs.append(img)
            
    return result_imgs            
In [23]:
img = test_img
result = draw_multiscaled_windows(img, fp)
final = [img] + result
print(len(final))
plot_images(final, ["original", "Cars detected"], rows=1, cols=2)
2
In [24]:
# Find Heat maps and labels.
def add_heat(img, bbox_list):
    """
    Create heat map across all boxes identified in a image.
    Return list of boxes which identified as hot.
    """
    heat = np.zeros_like(img[:,:,0]).astype(np.float)
    # Iterate through list of bboxes
    for box in bbox_list:
        # Add += 1 for all pixels inside each bbox
        # Assuming each "box" takes the form ((x1, y1), (x2, y2))
        heat[box[0][1]:box[1][1], box[0][0]:box[1][0]] += 1

    # Return updated heatmap
    return heat

def apply_threshold(heatmap, threshold=2):
    """ Given a heatmap and threshold remove areas which are 
    not considered 'hot' as intended. Remove false positives.
    Return updated heatmap.
    """
    # Zero out pixels below the threshold
    heatmap[heatmap <= threshold] = 0
    return heatmap

def get_labeled_bboxes(img, labels):
    """ 
    Return a list of labeled boxes.
    """
    labeled_boxes = []
    # Iterate through all detected cars
    for car_number in range(1, labels[1]+1):
        # Find pixels with each car_number label value
        nonzero = (labels[0] == car_number).nonzero()
        # Identify x and y values of those pixels
        nonzeroy = np.array(nonzero[0])
        nonzerox = np.array(nonzero[1])
        # Define a bounding box based on min/max x and y
        bbox = ((np.min(nonzerox), np.min(nonzeroy)), 
                (np.max(nonzerox), np.max(nonzeroy)))
        
        labeled_boxes.append((bbox[0], bbox[1]))
        #cv2.rectangle(img, bbox[0], bbox[1], (0,255,0), 6)
    # Return the image
    return labeled_boxes
In [25]:
# Test heat map and threshold.
img = test_img
boxes = multi_scaled_window_search(img, fp)
heat_map = add_heat(img, boxes)
heat_map = apply_threshold(heat_map, threshold=2)
heat_map = np.clip(heat_map, 0, 255)
plot_images([img, heat_map], ["original", "heat map"], rows=1, cols=2)

Alternative method - Use Previous labeled boxes for searching next frame.

Searching each frame of video with sliding window is costly. It goes over each frame with 3 scales with 3 different window sizes. Then uses heat map and labelling to condense to labaled boxes. This is costly. We could re-use previous frames labeled boxes and extrapolate them by a margin of ~10 pixes (left, right and forward) and then use predict we can determine hot space without too much calculation. When prediction is below certain % we can switch back to multi scaling. This could be previously implemented but not sure. After reading through https://dam-prod.media.mit.edu/x/files/thesis/2015/savannah-ms.pdf https://www.polygon.com/2014/6/5/5761780/frame-rate-resolution-graphics-primer-ps4-xbox-one I felt this is a good performance ehnacement thing to do;

In [26]:
# Not working as expected; TODO. reviewer: This method is not called now.
def get_regions_from_prev(img, fp, boxes):
    """
    Returns a list of rectangle co-ordinates for all regions where a vehicle
    is detected.
    Arguments:
    img: Original image.
    x_low_high : X region of interest in image (start, end).
    y_low_high : Y region of interest in image (start, end).
    svc : Trained classifier; support vector classifier.
    """ 
    
    # This is the first region for original scaling.
    ystart, ystop = (340, 656)
    rectangles = []
    input_boxes = []
    # Assuming x == y.
    pix_per_cell = fp.pix_per_cell[0]
    cells_per_block = fp.cells_per_block[0]
    window = 64
    nblocks_per_window = (window // pix_per_cell) - cells_per_block + 1
    
    # This assumes image has scaled to 255.
    draw_img = np.copy(img)
    img = img.astype(np.float32)/255
    img_to_search = img[ystart:ystop,:,:]
    cs_img = get_color_space(img_to_search, fp)
    
    ch1 = cs_img[:,:,0]
    ch2 = cs_img[:,:,1]
    ch3 = cs_img[:,:,2]
    
    # Compute individual channel HOG features for the entire image
    hog1 = get_hog_features(ch1, fp)
    hog2 = get_hog_features(ch2, fp)
    hog3 = get_hog_features(ch3, fp)
    
    # Create new boxes based on old
    delta = 32
    side_delta = delta // 2
    
    for box in boxes:
        # Add left.
        top_left_x = box[0][0]+side_delta
        top_left_y = (box[0][1]-side_delta) - ystart
        bottom_right_x = box[1][0]+side_delta
        bottom_right_y = (box[1][1]-side_delta) - ystart
        input_boxes.append(((top_left_x, top_left_y), 
                            (bottom_right_x, bottom_right_y)))
        
        # Add right
        top_left_x = box[0][0]-side_delta
        top_left_y = (box[0][1]-side_delta) - ystart
        bottom_right_x = box[1][0]-side_delta
        bottom_right_y = (box[1][1]-side_delta) - ystart
        input_boxes.append(((top_left_x, top_left_y),
                            (bottom_right_x, bottom_right_y)))
        
        # Add straight
        top_left_x = box[0][0]
        top_left_y = (box[0][1]-delta) - ystart
        bottom_right_x = box[1][0]
        bottom_right_y = (box[1][1]-delta) - ystart
        input_boxes.append(((top_left_x, top_left_y),
                            (bottom_right_x, bottom_right_y)))
    
        # Add original
        top_left_x = box[0][0]
        top_left_y = box[0][1] - ystart
        bottom_right_x = box[1][0]
        bottom_right_y = box[1][1] - ystart
        input_boxes.append(((top_left_x, top_left_y),
                            (bottom_right_x, bottom_right_y)))
        
    for rect in input_boxes:
        tl_x = rect[0][0]
        tl_y = rect[0][1]
        br_x = rect[1][0]
        br_y = rect[1][1]
        
        # Get hog features of box.
        hog_feat1 = hog1[tl_y:br_y, tl_x:br_x].ravel()
        hog_feat2 = hog2[tl_y:br_y, tl_x:br_x].ravel()
        hog_feat3 = hog3[tl_y:br_y, tl_x:br_x].ravel()
        hog_features = np.hstack((hog_feat1, hog_feat2, hog_feat3))
        pdb.set_trace()
        sub_img = cs_img[tl_y:br_y, tl_x:br_x]
        # Get features
        features = get_image_features(sub_img, fp, is_sliding_w=True)
        
        features.append(hog_features)
        # Combine all.
        features = np.hstack(features).reshape(1, -1)
            
        # Scale features and make a prediction
        test_features = fp.X_scaler.transform(features)    
        test_prediction = fp.svc.predict(test_features)
        if test_predition == 1:
            rectangles.append(rect)
            
    # Scale back to origianl height
    ret_rectangles = []
    for box in rectangles:
        top_left_x = box[0][0]
        top_left_y = box[0][1] + ystart
        bottom_right_x = box[1][0]
        bottom_right_y = box[1][1] + ystart
        ret_rectangles.append(((top_left_x, top_left_y),
                               (bottom_right_x, bottom_right_y)))
        
    return ret_rectangles
In [27]:
# Workflow to parse the boxes identified with heat map and 
# labelling to identify final box which fits a vehicle.
fp.feature_vec = False
def find_vehicles(orig_img, fp, p_frame=None, return_boxes=False):
    """
    Returns an image with detected vehicles or labeled boxes based on
    argument return_boxes.
    fp: image feature parameters.
    p_frame : Video frame deque object of type VehicleVideoFrame
    """
    
    threshold = 2
    p_boxes = []
    p_threshold = 0
    if p_frame is not None:
        # Use last frame detected boxes to be used in current detection.
        p_boxes = p_frame.last_frame_boxes()
        # Have the new threshold to be half of previous to
        # eliminate false positives and at the same time not to
        # ignore new ones. Bug: Need to address it per car level or not?
        p_threshold = int(len(p_boxes)//2)
    
    # Get a list of boxes(represented as rectangles) where a 
    # Vehicle is detected using multi sliding window technique.
    boxes = multi_scaled_window_search(orig_img, fp)
    
    # Implements Boxes from previous frame technique. Commented out.
    #if p_frame is not None and len(p_frame) == p_frame.maxlen \
    #    and p_frame.prev_n < 2:
    #    boxes = get_regions_from_prev(orig_img, fp, p_boxes)
    #    # If number of new boxes are less than previous detected boxes, something
    #    # is a miss. Start with sliding window again.
    #    # For every 3 frames switch to Multi-scale-window search.
    #    if len(new_boxes) < len(p_boxes) or p_frame.prev_n >= 2:
    #        boxes = multi_scaled_window_search(orig_img, fp)
    #        p_frame.prev_n = 0
    #    else:
    #        p_frame.prev_n += 1
    #        # Debug
    #        prev_frames += 1
    #else:
    #   boxes = multi_scaled_window_search(orig_img, fp)
    
    if p_frame is not None:
        boxes.extend(p_boxes)
        
    # Heatmap across all boxes.
    heatmap = add_heat(orig_img, boxes)
    
    if p_frame is not None:
        threshold += p_threshold
        
    # Apply threshold to remove false positives
    heatmap_th = apply_threshold(heatmap, threshold=threshold)
    
    # Visualize the heatmap when displaying    
    heatmap_th = np.clip(heatmap_th, 0, 255)
    
    # Get labels for heat maps.
    labels = label(heatmap_th)
    
    # Map boxes to labels and resize boxes accordingly.
    labeled_boxes = get_labeled_bboxes(orig_img, labels)
    
    if p_frame is not None:
        # Add detected boxes here to be used for next frame.
        p_frame.add_frame_info(labeled_boxes)
        
    # More of a hack here. Not ideal to return 2 different types based
    # on input param.
    if return_boxes:
        return labeled_boxes
    else:
        # Draw labeled boxed on image.
        detected_img = draw_boxes(orig_img, labeled_boxes, color=(0,255,0))
        return detected_img
In [31]:
# Test final image processing.
img = test_img
final = find_vehicles(img, fp)
plot_images([img, final], ["Original", "Labeled Vehicles"], rows=1, cols=2)
In [167]:
# Detect vehicles all test images.
test_images = glob.glob('./test_images/*.jpg')
base_output = "./output_images/"
disp_imgs = []
disp_labels = []

for i, fname in enumerate(test_images):
    print("processing image %s" % fname)
    file_name = fname.split('/')[-1]
    output = os.path.join(base_output, file_name)
    
    img = plt.imread(fname)
    detected_img = find_vehicles(img, fp)
    
    print("Saving image: %s" % output)
    plt.imsave(output, detected_img)
    
    disp_imgs.append(detected_img)
    disp_labels.append(file_name)
print("Done")

# Visualize all test images.
plot_images(disp_imgs, disp_labels, rows=3, cols=2)
processing image ./test_images/test1.jpg
Saving image: ./output_images/test1.jpg
processing image ./test_images/test2.jpg
Saving image: ./output_images/test2.jpg
processing image ./test_images/test3.jpg
Saving image: ./output_images/test3.jpg
processing image ./test_images/test4.jpg
Saving image: ./output_images/test4.jpg
processing image ./test_images/test5.jpg
Saving image: ./output_images/test5.jpg
processing image ./test_images/test6.jpg
Saving image: ./output_images/test6.jpg
Done
In [28]:
# A class to store information related to vehicles detected
# in video frames. Mostly for processing vehicles in future
# frames using previous vehicle detection inforation.
class VehicleVideoFrame(deque):
    def __init__(self, npreviousframes=5):
        """ 
        A ring buffer like data structure to store previous frame
        rectangular boxes as single unit.
        """
        super(VehicleVideoFrame, self).__init__(maxlen=npreviousframes)
        self.prev_n = 0
        
    def add_frame_info(self, labeled_boxes):
        """ Appends the labeled boxes to end of frames. """
        self.append(labeled_boxes)
        
    def last_frame_boxes(self):
        """ Returns a list of boxes added from last frame. """
        f_len = len(self)
        if f_len == 0:
            return []
        else:
            return self[f_len-1]
    # Mostly used for using prev_frame technique.
    @property
    def prev_n(self):
        return self.__prev_n
    
    @prev_n.setter
    def prev_n(self, n):
        self.__prev_n = n

Here the the testing in done in 2 phases. 1) Process project and test video without lanes. Just vehicle detection. 2) Process project and test video and local video with lane and vehicle detection.

In [29]:
p_frame = VehicleVideoFrame(npreviousframes=5)
fp.feature_vec = False

def find_vehicles_from_frame(img):
    """ Returns detected vehicles boxes.
    """
    return find_vehicles(img, fp, p_frame=p_frame)
    
def process_vehicle_video(input, output):
    """
    Returns processed video for finding vehicles.
    input: Path to input video file
    output: Path to output video file.
    """
    # Vehicle detection variables.
    pf = VehicleVideoFrame()
    
    # Process video.
    vfc = VideoFileClip(input)
    pvi = vfc.fl_image(find_vehicles_from_frame) #subclip(0,10)
    pvi.write_videofile(output, audio=False)
In [174]:
# Process test Video with just Vehicle detection
process_vehicle_video("test_video.mp4",  "output_test_video_1.mp4")
[MoviePy] >>>> Building video output_test_video_1.mp4
[MoviePy] Writing video output_test_video_1.mp4
 97%|█████████▋| 38/39 [01:34<00:02,  2.61s/it]
[MoviePy] Done.
[MoviePy] >>>> Video ready: output_test_video_1.mp4 

In [37]:
# Just vehicle detection.
process_vehicle_video("project_video.mp4", "out_project_video.mp4")
# Total time taken is ~47mins.
[MoviePy] >>>> Building video out_project_video.mp4
[MoviePy] Writing video out_project_video.mp4
100%|█████████▉| 1260/1261 [51:27<00:02,  2.14s/it]  
[MoviePy] Done.
[MoviePy] >>>> Video ready: out_project_video.mp4 

In [30]:
# Import advanced lane line project; This could be better rather
# than import *.
from advanced_lane_lines import *
In [31]:
# Test Advanced lanes is working as expected.
#create_video('./test_video.mp4', './out_advanced_lanes_test_video.mp4')
In [34]:
# Use multithreading to process lanes and vehicles and return
# processed image.

# Note: Wrapper methods are created here to handle multiprocessing of methods
# which cannot have return values but rather a queue.

p_frame = VehicleVideoFrame(npreviousframes=5)
fp.feature_vec = False
ret_queue = Queue()

def find_vehicles_adv(ret_queue, orig_img, fp, p_frame=None):
    """ Returns detected vehicles boxes.
    """
    boxes = find_vehicles(orig_img, fp, p_frame=p_frame, return_boxes=True)
    # 2 is used to identify method name. Puts the boxes in a queue instead
    # of return.
    ret_queue.put((boxes, 2))
    
def find_lanes_adv(ret_queue, img):
    """ Returns image with detected lanes with other params."""
    ret_img = process_image(img)
    # ID of this method is 1.
    ret_queue.put((ret_img, 1))
    
    
def process_video_frame(img):
    """
    Returns an image within video frame with lanes and Vehicles.
    """
    
    # Uses thread mechanism to call 2 detections and returns
    # processed image after both threads are returned.
    # For simplicity sake, Lanes method uses 1 as its ID and 
    # Vehicle detection method uses 2 as its ID.
    
    global ret_queue
    # Each gets a copy of image.
    img1 = np.copy(img) 
    img2 = np.copy(img)
        
    # Initialize threads which does their own task.
    lane_thread = threading.Thread(find_lanes_adv(ret_queue, img1))
    
    vehicle_thread = threading.Thread(find_vehicles_adv(ret_queue, 
                                        img2, fp, p_frame=p_frame))
    
    # Start threads.
    vehicle_thread.start()
    lane_thread.start()
    
    # Wait until both are done.
    vehicle_thread.join()
    lane_thread.join()
    
    # Process output from both detections.
    lane_img = None
    boxes = []
    
    while not ret_queue.empty():
        value = ret_queue.get()
        # Lane.
        if value[1] == 1:
            lane_img = value[0]
        # Vehicles
        else:
            boxes = value[0]
            
    # Return original image if either of them is empty; something is wrong.
    if (not lane_img.any()): # or (not boxes):
        return img
    else:
        # Draw boxes on detected lanes.
        processed_img = draw_boxes(lane_img, boxes, color=(0,255,0))
        return processed_img
    
def process_lane_vehicle_video(input, output):
    """
    Returns processed video for finding lanes and vehicles.
    input: Path to input video file
    output: Path to output video file.
    """
    
    # Lane Finding global variables.
    global inter_fail_cnt
    inter_fail_cnt = 0
    global inter_diff
    inter_diff = []
    # Other globals.
    global l_line
    l_line = LaneLine()
    global r_line
    r_line = LaneLine()
    
    # Vehicle detection variables.
    pf = VehicleVideoFrame()
    
    # Process video.
    vfc = VideoFileClip(input)
    pvi = vfc.fl_image(process_video_frame) #subclip(0,10)
    pvi.write_videofile(output, audio=False)
In [36]:
# Test on test_video for finding vehicle and lane lines.
process_lane_vehicle_video("test_video.mp4",  "output_lane_vehicle_test_video_1.mp4")
In [67]:
# Test with project video.
process_lane_vehicle_video("project_video.mp4",  "output_lane_vehicle_project_video.mp4")
[MoviePy] >>>> Building video output_lane_vehicle_project_video.mp4
[MoviePy] Writing video output_lane_vehicle_project_video.mp4
  0%|          | 0/1261 [00:00<?, ?it/s]
  0%|          | 1/1261 [00:03<1:06:43,  3.18s/it]
  0%|          | 2/1261 [00:06<1:06:48,  3.18s/it]
  0%|          | 3/1261 [00:09<1:06:22,  3.17s/it]
  0%|          | 4/1261 [00:12<1:06:02,  3.15s/it]
  0%|          | 5/1261 [00:15<1:07:07,  3.21s/it]
  0%|          | 6/1261 [00:19<1:06:33,  3.18s/it]
  1%|          | 7/1261 [00:22<1:06:13,  3.17s/it]
  1%|          | 8/1261 [00:25<1:06:00,  3.16s/it]
  1%|          | 9/1261 [00:28<1:05:41,  3.15s/it]
  1%|          | 10/1261 [00:31<1:05:31,  3.14s/it]
  1%|          | 11/1261 [00:34<1:05:08,  3.13s/it]
  1%|          | 12/1261 [00:37<1:05:06,  3.13s/it]
  1%|          | 13/1261 [00:40<1:05:10,  3.13s/it]
  1%|          | 14/1261 [00:44<1:04:59,  3.13s/it]
  1%|          | 15/1261 [00:47<1:04:53,  3.12s/it]
  1%|▏         | 16/1261 [00:50<1:04:42,  3.12s/it]
  1%|▏         | 17/1261 [00:53<1:05:46,  3.17s/it]
  1%|▏         | 18/1261 [00:56<1:05:50,  3.18s/it]
  2%|▏         | 19/1261 [01:00<1:06:45,  3.22s/it]
  2%|▏         | 20/1261 [01:03<1:05:59,  3.19s/it]
  2%|▏         | 21/1261 [01:06<1:05:39,  3.18s/it]
  2%|▏         | 22/1261 [01:09<1:05:03,  3.15s/it]
  2%|▏         | 23/1261 [01:12<1:04:51,  3.14s/it]
  2%|▏         | 24/1261 [01:15<1:04:33,  3.13s/it]
  2%|▏         | 25/1261 [01:18<1:04:22,  3.13s/it]
  2%|▏         | 26/1261 [01:21<1:04:26,  3.13s/it]
  2%|▏         | 27/1261 [01:25<1:04:12,  3.12s/it]
  2%|▏         | 28/1261 [01:28<1:03:59,  3.11s/it]
  2%|▏         | 29/1261 [01:31<1:03:57,  3.11s/it]
  2%|▏         | 30/1261 [01:34<1:03:52,  3.11s/it]
  2%|▏         | 31/1261 [01:37<1:03:53,  3.12s/it]
  3%|▎         | 32/1261 [01:40<1:03:35,  3.10s/it]
  3%|▎         | 33/1261 [01:43<1:03:30,  3.10s/it]
  3%|▎         | 34/1261 [01:46<1:03:31,  3.11s/it]
  3%|▎         | 35/1261 [01:49<1:03:22,  3.10s/it]
  3%|▎         | 36/1261 [01:53<1:03:23,  3.11s/it]
  3%|▎         | 37/1261 [01:56<1:03:15,  3.10s/it]
  3%|▎         | 38/1261 [01:59<1:03:11,  3.10s/it]
  3%|▎         | 39/1261 [02:02<1:03:29,  3.12s/it]
  3%|▎         | 40/1261 [02:05<1:03:21,  3.11s/it]
  3%|▎         | 41/1261 [02:08<1:03:12,  3.11s/it]
  3%|▎         | 42/1261 [02:11<1:03:21,  3.12s/it]
  3%|▎         | 43/1261 [02:14<1:03:07,  3.11s/it]
  3%|▎         | 44/1261 [02:17<1:03:12,  3.12s/it]
  4%|▎         | 45/1261 [02:21<1:03:09,  3.12s/it]
  4%|▎         | 46/1261 [02:24<1:03:10,  3.12s/it]
  4%|▎         | 47/1261 [02:27<1:03:00,  3.11s/it]
  4%|▍         | 48/1261 [02:30<1:02:55,  3.11s/it]
  4%|▍         | 49/1261 [02:33<1:02:48,  3.11s/it]
  4%|▍         | 50/1261 [02:36<1:03:00,  3.12s/it]
  4%|▍         | 51/1261 [02:39<1:03:02,  3.13s/it]
  4%|▍         | 52/1261 [02:42<1:02:49,  3.12s/it]
  4%|▍         | 53/1261 [02:45<1:02:40,  3.11s/it]
  4%|▍         | 54/1261 [02:49<1:02:46,  3.12s/it]
  4%|▍         | 55/1261 [02:52<1:04:14,  3.20s/it]
  4%|▍         | 56/1261 [02:55<1:04:12,  3.20s/it]
  5%|▍         | 57/1261 [02:58<1:03:45,  3.18s/it]
  5%|▍         | 58/1261 [03:01<1:03:14,  3.15s/it]
  5%|▍         | 59/1261 [03:05<1:03:02,  3.15s/it]
  5%|▍         | 60/1261 [03:08<1:02:51,  3.14s/it]
  5%|▍         | 61/1261 [03:11<1:02:37,  3.13s/it]
  5%|▍         | 62/1261 [03:14<1:02:28,  3.13s/it]
  5%|▍         | 63/1261 [03:17<1:02:24,  3.13s/it]
  5%|▌         | 64/1261 [03:20<1:02:12,  3.12s/it]
  5%|▌         | 65/1261 [03:23<1:02:15,  3.12s/it]
  5%|▌         | 66/1261 [03:26<1:01:59,  3.11s/it]
  5%|▌         | 67/1261 [03:29<1:02:05,  3.12s/it]
  5%|▌         | 68/1261 [03:33<1:01:59,  3.12s/it]
  5%|▌         | 69/1261 [03:36<1:01:53,  3.12s/it]
  6%|▌         | 70/1261 [03:39<1:01:40,  3.11s/it]
  6%|▌         | 71/1261 [03:42<1:01:41,  3.11s/it]
  6%|▌         | 72/1261 [03:45<1:01:34,  3.11s/it]
  6%|▌         | 73/1261 [03:48<1:01:31,  3.11s/it]
  6%|▌         | 74/1261 [03:51<1:01:39,  3.12s/it]
  6%|▌         | 75/1261 [03:54<1:01:36,  3.12s/it]
  6%|▌         | 76/1261 [03:57<1:01:35,  3.12s/it]
  6%|▌         | 77/1261 [04:01<1:01:30,  3.12s/it]
  6%|▌         | 78/1261 [04:04<1:01:19,  3.11s/it]
  6%|▋         | 79/1261 [04:07<1:01:12,  3.11s/it]
  6%|▋         | 80/1261 [04:10<1:01:18,  3.12s/it]
  6%|▋         | 81/1261 [04:13<1:01:12,  3.11s/it]
  7%|▋         | 82/1261 [04:16<1:01:03,  3.11s/it]
  7%|▋         | 83/1261 [04:19<1:01:01,  3.11s/it]
  7%|▋         | 84/1261 [04:22<1:01:01,  3.11s/it]
  7%|▋         | 85/1261 [04:25<1:01:05,  3.12s/it]
  7%|▋         | 86/1261 [04:29<1:01:07,  3.12s/it]
  7%|▋         | 87/1261 [04:32<1:03:38,  3.25s/it]
  7%|▋         | 88/1261 [04:36<1:04:57,  3.32s/it]
  7%|▋         | 89/1261 [04:39<1:03:42,  3.26s/it]
  7%|▋         | 90/1261 [04:42<1:02:50,  3.22s/it]
  7%|▋         | 91/1261 [04:45<1:02:52,  3.22s/it]
  7%|▋         | 92/1261 [04:48<1:02:10,  3.19s/it]
  7%|▋         | 93/1261 [04:52<1:02:58,  3.23s/it]
  7%|▋         | 94/1261 [04:55<1:02:38,  3.22s/it]
  8%|▊         | 95/1261 [04:58<1:02:00,  3.19s/it]
  8%|▊         | 96/1261 [05:01<1:01:44,  3.18s/it]
  8%|▊         | 97/1261 [05:04<1:01:42,  3.18s/it]
  8%|▊         | 98/1261 [05:07<1:01:29,  3.17s/it]
  8%|▊         | 99/1261 [05:10<1:01:03,  3.15s/it]
  8%|▊         | 100/1261 [05:14<1:00:49,  3.14s/it]
  8%|▊         | 101/1261 [05:17<1:00:36,  3.13s/it]
  8%|▊         | 102/1261 [05:20<1:00:33,  3.14s/it]
  8%|▊         | 103/1261 [05:23<1:00:27,  3.13s/it]
  8%|▊         | 104/1261 [05:26<1:00:17,  3.13s/it]
  8%|▊         | 105/1261 [05:29<1:00:27,  3.14s/it]
  8%|▊         | 106/1261 [05:32<1:00:22,  3.14s/it]
  8%|▊         | 107/1261 [05:36<1:00:10,  3.13s/it]
  9%|▊         | 108/1261 [05:39<1:00:05,  3.13s/it]
  9%|▊         | 109/1261 [05:42<59:57,  3.12s/it]  
  9%|▊         | 110/1261 [05:45<59:49,  3.12s/it]
  9%|▉         | 111/1261 [05:48<59:44,  3.12s/it]
  9%|▉         | 112/1261 [05:51<59:49,  3.12s/it]
  9%|▉         | 113/1261 [05:54<59:41,  3.12s/it]
  9%|▉         | 114/1261 [05:57<59:41,  3.12s/it]
  9%|▉         | 115/1261 [06:00<59:44,  3.13s/it]
  9%|▉         | 116/1261 [06:04<59:38,  3.13s/it]
  9%|▉         | 117/1261 [06:07<59:34,  3.12s/it]
  9%|▉         | 118/1261 [06:10<59:31,  3.12s/it]
  9%|▉         | 119/1261 [06:13<59:31,  3.13s/it]
 10%|▉         | 120/1261 [06:16<59:23,  3.12s/it]
 10%|▉         | 121/1261 [06:19<59:26,  3.13s/it]
 10%|▉         | 122/1261 [06:22<59:33,  3.14s/it]
 10%|▉         | 123/1261 [06:26<59:35,  3.14s/it]
 10%|▉         | 124/1261 [06:29<59:26,  3.14s/it]
 10%|▉         | 125/1261 [06:32<59:20,  3.13s/it]
 10%|▉         | 126/1261 [06:35<59:11,  3.13s/it]
 10%|█         | 127/1261 [06:38<59:07,  3.13s/it]
 10%|█         | 128/1261 [06:41<59:02,  3.13s/it]
 10%|█         | 129/1261 [06:44<58:53,  3.12s/it]
 10%|█         | 130/1261 [06:47<58:50,  3.12s/it]
 10%|█         | 131/1261 [06:51<58:45,  3.12s/it]
 10%|█         | 132/1261 [06:54<1:00:01,  3.19s/it]
 11%|█         | 133/1261 [06:58<1:02:32,  3.33s/it]
 11%|█         | 134/1261 [07:01<1:05:36,  3.49s/it]
 11%|█         | 135/1261 [07:05<1:03:32,  3.39s/it]
 11%|█         | 136/1261 [07:09<1:08:11,  3.64s/it]
 11%|█         | 137/1261 [07:12<1:05:54,  3.52s/it]
 11%|█         | 138/1261 [07:15<1:03:41,  3.40s/it]
 11%|█         | 139/1261 [07:19<1:05:28,  3.50s/it]
 11%|█         | 140/1261 [07:23<1:07:33,  3.62s/it]
 11%|█         | 141/1261 [07:26<1:04:59,  3.48s/it]
 11%|█▏        | 142/1261 [07:30<1:07:00,  3.59s/it]
 11%|█▏        | 143/1261 [07:34<1:09:18,  3.72s/it]
 11%|█▏        | 144/1261 [07:38<1:12:36,  3.90s/it]
 11%|█▏        | 145/1261 [07:42<1:14:19,  4.00s/it]
 12%|█▏        | 146/1261 [07:47<1:16:00,  4.09s/it]
 12%|█▏        | 147/1261 [07:51<1:16:54,  4.14s/it]
 12%|█▏        | 148/1261 [07:55<1:15:29,  4.07s/it]
 12%|█▏        | 149/1261 [07:58<1:11:24,  3.85s/it]
 12%|█▏        | 150/1261 [08:01<1:07:47,  3.66s/it]
 12%|█▏        | 151/1261 [08:04<1:04:39,  3.50s/it]
 12%|█▏        | 152/1261 [08:08<1:02:27,  3.38s/it]
 12%|█▏        | 153/1261 [08:11<1:01:03,  3.31s/it]
 12%|█▏        | 154/1261 [08:14<1:00:01,  3.25s/it]
 12%|█▏        | 155/1261 [08:17<59:15,  3.21s/it]  
 12%|█▏        | 156/1261 [08:20<58:38,  3.18s/it]
 12%|█▏        | 157/1261 [08:23<58:19,  3.17s/it]
 13%|█▎        | 158/1261 [08:26<58:05,  3.16s/it]
 13%|█▎        | 159/1261 [08:29<57:50,  3.15s/it]
 13%|█▎        | 160/1261 [08:33<57:36,  3.14s/it]
 13%|█▎        | 161/1261 [08:36<57:18,  3.13s/it]
 13%|█▎        | 162/1261 [08:39<57:07,  3.12s/it]
 13%|█▎        | 163/1261 [08:42<57:00,  3.11s/it]
 13%|█▎        | 164/1261 [08:45<56:50,  3.11s/it]
 13%|█▎        | 165/1261 [08:48<56:55,  3.12s/it]
 13%|█▎        | 166/1261 [08:51<57:25,  3.15s/it]
 13%|█▎        | 167/1261 [08:55<58:44,  3.22s/it]
 13%|█▎        | 168/1261 [08:58<58:16,  3.20s/it]
 13%|█▎        | 169/1261 [09:01<57:42,  3.17s/it]
 13%|█▎        | 170/1261 [09:04<57:28,  3.16s/it]
 14%|█▎        | 171/1261 [09:07<57:13,  3.15s/it]
 14%|█▎        | 172/1261 [09:10<57:12,  3.15s/it]
 14%|█▎        | 173/1261 [09:14<57:02,  3.15s/it]
 14%|█▍        | 174/1261 [09:17<56:55,  3.14s/it]
 14%|█▍        | 175/1261 [09:20<56:39,  3.13s/it]
 14%|█▍        | 176/1261 [09:23<56:33,  3.13s/it]
 14%|█▍        | 177/1261 [09:26<56:30,  3.13s/it]
 14%|█▍        | 178/1261 [09:29<56:23,  3.12s/it]
 14%|█▍        | 179/1261 [09:32<56:43,  3.15s/it]
 14%|█▍        | 180/1261 [09:35<56:37,  3.14s/it]
 14%|█▍        | 181/1261 [09:39<56:27,  3.14s/it]
 14%|█▍        | 182/1261 [09:42<56:21,  3.13s/it]
 15%|█▍        | 183/1261 [09:45<56:06,  3.12s/it]
 15%|█▍        | 184/1261 [09:48<56:03,  3.12s/it]
 15%|█▍        | 185/1261 [09:51<55:53,  3.12s/it]
 15%|█▍        | 186/1261 [09:54<55:44,  3.11s/it]
 15%|█▍        | 187/1261 [09:57<55:51,  3.12s/it]
 15%|█▍        | 188/1261 [10:00<55:56,  3.13s/it]
 15%|█▍        | 189/1261 [10:04<55:46,  3.12s/it]
 15%|█▌        | 190/1261 [10:07<55:47,  3.13s/it]
 15%|█▌        | 191/1261 [10:10<55:41,  3.12s/it]
 15%|█▌        | 192/1261 [10:13<55:35,  3.12s/it]
 15%|█▌        | 193/1261 [10:16<55:34,  3.12s/it]
 15%|█▌        | 194/1261 [10:19<56:41,  3.19s/it]
 15%|█▌        | 195/1261 [10:23<56:24,  3.17s/it]
 16%|█▌        | 196/1261 [10:26<56:00,  3.16s/it]
 16%|█▌        | 197/1261 [10:29<55:46,  3.15s/it]
 16%|█▌        | 198/1261 [10:32<55:33,  3.14s/it]
 16%|█▌        | 199/1261 [10:35<55:25,  3.13s/it]
 16%|█▌        | 200/1261 [10:38<55:25,  3.13s/it]
 16%|█▌        | 201/1261 [10:41<55:23,  3.14s/it]
 16%|█▌        | 202/1261 [10:44<55:09,  3.13s/it]
 16%|█▌        | 203/1261 [10:48<55:15,  3.13s/it]
 16%|█▌        | 204/1261 [10:51<55:06,  3.13s/it]
 16%|█▋        | 205/1261 [10:54<56:14,  3.20s/it]
 16%|█▋        | 206/1261 [10:57<55:57,  3.18s/it]
 16%|█▋        | 207/1261 [11:00<56:02,  3.19s/it]
 16%|█▋        | 208/1261 [11:04<58:59,  3.36s/it]
 17%|█▋        | 209/1261 [11:07<58:12,  3.32s/it]
 17%|█▋        | 210/1261 [11:10<57:04,  3.26s/it]
 17%|█▋        | 211/1261 [11:14<56:12,  3.21s/it]
 17%|█▋        | 212/1261 [11:17<55:33,  3.18s/it]
 17%|█▋        | 213/1261 [11:20<55:10,  3.16s/it]
 17%|█▋        | 214/1261 [11:23<55:03,  3.16s/it]
 17%|█▋        | 215/1261 [11:26<54:46,  3.14s/it]
 17%|█▋        | 216/1261 [11:29<54:36,  3.14s/it]
 17%|█▋        | 217/1261 [11:32<54:32,  3.13s/it]
 17%|█▋        | 218/1261 [11:35<54:31,  3.14s/it]
 17%|█▋        | 219/1261 [11:39<54:17,  3.13s/it]
 17%|█▋        | 220/1261 [11:42<54:16,  3.13s/it]
 18%|█▊        | 221/1261 [11:45<54:11,  3.13s/it]
 18%|█▊        | 222/1261 [11:48<54:10,  3.13s/it]
 18%|█▊        | 223/1261 [11:51<54:12,  3.13s/it]
 18%|█▊        | 224/1261 [11:54<54:03,  3.13s/it]
 18%|█▊        | 225/1261 [11:57<54:00,  3.13s/it]
 18%|█▊        | 226/1261 [12:01<54:53,  3.18s/it]
 18%|█▊        | 227/1261 [12:04<54:33,  3.17s/it]
 18%|█▊        | 228/1261 [12:07<54:19,  3.16s/it]
 18%|█▊        | 229/1261 [12:10<54:03,  3.14s/it]
 18%|█▊        | 230/1261 [12:13<53:55,  3.14s/it]
 18%|█▊        | 231/1261 [12:16<53:49,  3.14s/it]
 18%|█▊        | 232/1261 [12:19<53:35,  3.12s/it]
 18%|█▊        | 233/1261 [12:22<53:43,  3.14s/it]
 19%|█▊        | 234/1261 [12:26<53:30,  3.13s/it]
 19%|█▊        | 235/1261 [12:29<53:23,  3.12s/it]
 19%|█▊        | 236/1261 [12:32<53:18,  3.12s/it]
 19%|█▉        | 237/1261 [12:35<53:17,  3.12s/it]
 19%|█▉        | 238/1261 [12:38<53:12,  3.12s/it]
 19%|█▉        | 239/1261 [12:41<53:15,  3.13s/it]
 19%|█▉        | 240/1261 [12:44<53:12,  3.13s/it]
 19%|█▉        | 241/1261 [12:47<53:11,  3.13s/it]
 19%|█▉        | 242/1261 [12:51<53:09,  3.13s/it]
 19%|█▉        | 243/1261 [12:54<54:15,  3.20s/it]
 19%|█▉        | 244/1261 [12:57<53:45,  3.17s/it]
 19%|█▉        | 245/1261 [13:00<53:24,  3.15s/it]
 20%|█▉        | 246/1261 [13:03<53:23,  3.16s/it]
 20%|█▉        | 247/1261 [13:06<53:14,  3.15s/it]
 20%|█▉        | 248/1261 [13:10<52:50,  3.13s/it]
 20%|█▉        | 249/1261 [13:13<52:48,  3.13s/it]
 20%|█▉        | 250/1261 [13:16<52:42,  3.13s/it]
 20%|█▉        | 251/1261 [13:19<52:33,  3.12s/it]
 20%|█▉        | 252/1261 [13:22<52:31,  3.12s/it]
 20%|██        | 253/1261 [13:25<52:29,  3.12s/it]
 20%|██        | 254/1261 [13:28<52:25,  3.12s/it]
 20%|██        | 255/1261 [13:31<52:28,  3.13s/it]
 20%|██        | 256/1261 [13:35<52:16,  3.12s/it]
 20%|██        | 257/1261 [13:38<52:11,  3.12s/it]
 20%|██        | 258/1261 [13:41<52:08,  3.12s/it]
 21%|██        | 259/1261 [13:44<51:59,  3.11s/it]
 21%|██        | 260/1261 [13:47<52:03,  3.12s/it]
 21%|██        | 261/1261 [13:50<51:58,  3.12s/it]
 21%|██        | 262/1261 [13:53<52:00,  3.12s/it]
 21%|██        | 263/1261 [13:56<52:01,  3.13s/it]
 21%|██        | 264/1261 [14:00<52:05,  3.13s/it]
 21%|██        | 265/1261 [14:03<51:51,  3.12s/it]
 21%|██        | 266/1261 [14:06<51:45,  3.12s/it]
 21%|██        | 267/1261 [14:09<51:52,  3.13s/it]
 21%|██▏       | 268/1261 [14:12<51:44,  3.13s/it]
 21%|██▏       | 269/1261 [14:15<51:46,  3.13s/it]
 21%|██▏       | 270/1261 [14:18<51:39,  3.13s/it]
 21%|██▏       | 271/1261 [14:21<51:32,  3.12s/it]
 22%|██▏       | 272/1261 [14:25<51:29,  3.12s/it]
 22%|██▏       | 273/1261 [14:28<51:27,  3.12s/it]
 22%|██▏       | 274/1261 [14:31<51:32,  3.13s/it]
 22%|██▏       | 275/1261 [14:34<51:23,  3.13s/it]
 22%|██▏       | 276/1261 [14:37<51:24,  3.13s/it]
 22%|██▏       | 277/1261 [14:40<51:21,  3.13s/it]
 22%|██▏       | 278/1261 [14:43<51:21,  3.13s/it]
 22%|██▏       | 279/1261 [14:46<51:18,  3.14s/it]
 22%|██▏       | 280/1261 [14:50<51:19,  3.14s/it]
 22%|██▏       | 281/1261 [14:53<52:17,  3.20s/it]
 22%|██▏       | 282/1261 [14:56<51:55,  3.18s/it]
 22%|██▏       | 283/1261 [14:59<51:45,  3.17s/it]
 23%|██▎       | 284/1261 [15:02<51:31,  3.16s/it]
 23%|██▎       | 285/1261 [15:06<51:14,  3.15s/it]
 23%|██▎       | 286/1261 [15:09<51:00,  3.14s/it]
 23%|██▎       | 287/1261 [15:12<50:53,  3.13s/it]
 23%|██▎       | 288/1261 [15:15<51:28,  3.17s/it]
 23%|██▎       | 289/1261 [15:18<51:11,  3.16s/it]
 23%|██▎       | 290/1261 [15:21<51:14,  3.17s/it]
 23%|██▎       | 291/1261 [15:24<51:00,  3.16s/it]
 23%|██▎       | 292/1261 [15:28<50:53,  3.15s/it]
 23%|██▎       | 293/1261 [15:31<50:47,  3.15s/it]
 23%|██▎       | 294/1261 [15:34<51:34,  3.20s/it]
 23%|██▎       | 295/1261 [15:37<51:07,  3.18s/it]
 23%|██▎       | 296/1261 [15:40<50:51,  3.16s/it]
 24%|██▎       | 297/1261 [15:43<50:38,  3.15s/it]
 24%|██▎       | 298/1261 [15:47<50:25,  3.14s/it]
 24%|██▎       | 299/1261 [15:50<50:19,  3.14s/it]
 24%|██▍       | 300/1261 [15:53<50:23,  3.15s/it]
 24%|██▍       | 301/1261 [15:56<50:18,  3.14s/it]
 24%|██▍       | 302/1261 [15:59<50:20,  3.15s/it]
 24%|██▍       | 303/1261 [16:02<50:03,  3.14s/it]
 24%|██▍       | 304/1261 [16:05<49:59,  3.13s/it]
 24%|██▍       | 305/1261 [16:09<49:57,  3.14s/it]
 24%|██▍       | 306/1261 [16:12<49:46,  3.13s/it]
 24%|██▍       | 307/1261 [16:15<49:38,  3.12s/it]
 24%|██▍       | 308/1261 [16:18<49:34,  3.12s/it]
 25%|██▍       | 309/1261 [16:21<49:26,  3.12s/it]
 25%|██▍       | 310/1261 [16:24<49:19,  3.11s/it]
 25%|██▍       | 311/1261 [16:27<49:14,  3.11s/it]
 25%|██▍       | 312/1261 [16:30<49:15,  3.11s/it]
 25%|██▍       | 313/1261 [16:33<49:16,  3.12s/it]
 25%|██▍       | 314/1261 [16:37<49:17,  3.12s/it]
 25%|██▍       | 315/1261 [16:40<49:18,  3.13s/it]
 25%|██▌       | 316/1261 [16:43<49:25,  3.14s/it]
 25%|██▌       | 317/1261 [16:46<49:20,  3.14s/it]
 25%|██▌       | 318/1261 [16:49<49:18,  3.14s/it]
 25%|██▌       | 319/1261 [16:53<50:26,  3.21s/it]
 25%|██▌       | 320/1261 [16:56<50:15,  3.20s/it]
 25%|██▌       | 321/1261 [16:59<50:03,  3.20s/it]
 26%|██▌       | 322/1261 [17:02<49:44,  3.18s/it]
 26%|██▌       | 323/1261 [17:05<49:30,  3.17s/it]
 26%|██▌       | 324/1261 [17:08<49:14,  3.15s/it]
 26%|██▌       | 325/1261 [17:11<49:16,  3.16s/it]
 26%|██▌       | 326/1261 [17:15<48:58,  3.14s/it]
 26%|██▌       | 327/1261 [17:18<48:54,  3.14s/it]
 26%|██▌       | 328/1261 [17:21<48:44,  3.13s/it]
 26%|██▌       | 329/1261 [17:24<48:40,  3.13s/it]
 26%|██▌       | 330/1261 [17:27<48:26,  3.12s/it]
 26%|██▌       | 331/1261 [17:30<48:30,  3.13s/it]
 26%|██▋       | 332/1261 [17:33<48:24,  3.13s/it]
 26%|██▋       | 333/1261 [17:36<48:19,  3.12s/it]
 26%|██▋       | 334/1261 [17:40<48:13,  3.12s/it]
 27%|██▋       | 335/1261 [17:43<48:11,  3.12s/it]
 27%|██▋       | 336/1261 [17:46<48:06,  3.12s/it]
 27%|██▋       | 337/1261 [17:49<48:01,  3.12s/it]
 27%|██▋       | 338/1261 [17:52<48:02,  3.12s/it]
 27%|██▋       | 339/1261 [17:55<48:05,  3.13s/it]
 27%|██▋       | 340/1261 [17:59<50:56,  3.32s/it]
 27%|██▋       | 341/1261 [18:02<50:49,  3.31s/it]
 27%|██▋       | 342/1261 [18:05<49:58,  3.26s/it]
 27%|██▋       | 343/1261 [18:09<49:13,  3.22s/it]
 27%|██▋       | 344/1261 [18:12<48:45,  3.19s/it]
 27%|██▋       | 345/1261 [18:15<48:22,  3.17s/it]
 27%|██▋       | 346/1261 [18:18<48:12,  3.16s/it]
 28%|██▊       | 347/1261 [18:21<48:04,  3.16s/it]
 28%|██▊       | 348/1261 [18:24<47:47,  3.14s/it]
 28%|██▊       | 349/1261 [18:27<47:39,  3.14s/it]
 28%|██▊       | 350/1261 [18:30<47:36,  3.14s/it]
 28%|██▊       | 351/1261 [18:34<47:24,  3.13s/it]
 28%|██▊       | 352/1261 [18:37<47:17,  3.12s/it]
 28%|██▊       | 353/1261 [18:40<47:07,  3.11s/it]
 28%|██▊       | 354/1261 [18:43<47:03,  3.11s/it]
 28%|██▊       | 355/1261 [18:46<47:00,  3.11s/it]
 28%|██▊       | 356/1261 [18:49<46:57,  3.11s/it]
 28%|██▊       | 357/1261 [18:52<47:57,  3.18s/it]
 28%|██▊       | 358/1261 [18:56<47:49,  3.18s/it]
 28%|██▊       | 359/1261 [18:59<47:31,  3.16s/it]
 29%|██▊       | 360/1261 [19:02<47:28,  3.16s/it]
 29%|██▊       | 361/1261 [19:05<47:16,  3.15s/it]
 29%|██▊       | 362/1261 [19:08<47:11,  3.15s/it]
 29%|██▉       | 363/1261 [19:11<47:03,  3.14s/it]
 29%|██▉       | 364/1261 [19:14<46:54,  3.14s/it]
 29%|██▉       | 365/1261 [19:18<46:51,  3.14s/it]
 29%|██▉       | 366/1261 [19:21<46:36,  3.13s/it]
 29%|██▉       | 367/1261 [19:24<46:38,  3.13s/it]
 29%|██▉       | 368/1261 [19:27<46:33,  3.13s/it]
 29%|██▉       | 369/1261 [19:30<46:31,  3.13s/it]
 29%|██▉       | 370/1261 [19:33<46:29,  3.13s/it]
 29%|██▉       | 371/1261 [19:36<46:23,  3.13s/it]
 30%|██▉       | 372/1261 [19:39<46:15,  3.12s/it]
 30%|██▉       | 373/1261 [19:42<46:10,  3.12s/it]
 30%|██▉       | 374/1261 [19:46<46:04,  3.12s/it]
 30%|██▉       | 375/1261 [19:49<45:56,  3.11s/it]
 30%|██▉       | 376/1261 [19:52<45:56,  3.12s/it]
 30%|██▉       | 377/1261 [19:55<45:53,  3.11s/it]
 30%|██▉       | 378/1261 [19:58<45:51,  3.12s/it]
 30%|███       | 379/1261 [20:01<45:59,  3.13s/it]
 30%|███       | 380/1261 [20:04<46:03,  3.14s/it]
 30%|███       | 381/1261 [20:07<45:57,  3.13s/it]
 30%|███       | 382/1261 [20:11<45:56,  3.14s/it]
 30%|███       | 383/1261 [20:14<45:51,  3.13s/it]
 30%|███       | 384/1261 [20:17<45:48,  3.13s/it]
 31%|███       | 385/1261 [20:20<45:37,  3.13s/it]
 31%|███       | 386/1261 [20:23<45:41,  3.13s/it]
 31%|███       | 387/1261 [20:26<45:34,  3.13s/it]
 31%|███       | 388/1261 [20:29<45:34,  3.13s/it]
 31%|███       | 389/1261 [20:33<45:31,  3.13s/it]
 31%|███       | 390/1261 [20:36<45:31,  3.14s/it]
 31%|███       | 391/1261 [20:39<45:18,  3.13s/it]
 31%|███       | 392/1261 [20:42<45:18,  3.13s/it]
 31%|███       | 393/1261 [20:45<45:10,  3.12s/it]
 31%|███       | 394/1261 [20:48<45:07,  3.12s/it]
 31%|███▏      | 395/1261 [20:51<45:24,  3.15s/it]
 31%|███▏      | 396/1261 [20:55<46:01,  3.19s/it]
 31%|███▏      | 397/1261 [20:58<45:48,  3.18s/it]
 32%|███▏      | 398/1261 [21:01<45:33,  3.17s/it]
 32%|███▏      | 399/1261 [21:04<45:20,  3.16s/it]
 32%|███▏      | 400/1261 [21:07<45:02,  3.14s/it]
 32%|███▏      | 401/1261 [21:10<45:03,  3.14s/it]
 32%|███▏      | 402/1261 [21:13<45:00,  3.14s/it]
 32%|███▏      | 403/1261 [21:17<44:59,  3.15s/it]
 32%|███▏      | 404/1261 [21:20<44:50,  3.14s/it]
 32%|███▏      | 405/1261 [21:23<44:47,  3.14s/it]
 32%|███▏      | 406/1261 [21:26<44:38,  3.13s/it]
 32%|███▏      | 407/1261 [21:29<44:32,  3.13s/it]
 32%|███▏      | 408/1261 [21:32<44:26,  3.13s/it]
 32%|███▏      | 409/1261 [21:35<44:26,  3.13s/it]
 33%|███▎      | 410/1261 [21:39<44:24,  3.13s/it]
 33%|███▎      | 411/1261 [21:42<44:24,  3.13s/it]
 33%|███▎      | 412/1261 [21:45<44:22,  3.14s/it]
 33%|███▎      | 413/1261 [21:48<44:10,  3.13s/it]
 33%|███▎      | 414/1261 [21:51<44:08,  3.13s/it]
 33%|███▎      | 415/1261 [21:54<44:01,  3.12s/it]
 33%|███▎      | 416/1261 [21:57<43:54,  3.12s/it]
 33%|███▎      | 417/1261 [22:00<43:59,  3.13s/it]
 33%|███▎      | 418/1261 [22:04<44:09,  3.14s/it]
 33%|███▎      | 419/1261 [22:07<44:01,  3.14s/it]
 33%|███▎      | 420/1261 [22:10<43:57,  3.14s/it]
 33%|███▎      | 421/1261 [22:13<43:47,  3.13s/it]
 33%|███▎      | 422/1261 [22:16<43:45,  3.13s/it]
 34%|███▎      | 423/1261 [22:19<43:42,  3.13s/it]
 34%|███▎      | 424/1261 [22:22<43:44,  3.14s/it]
 34%|███▎      | 425/1261 [22:26<43:54,  3.15s/it]
 34%|███▍      | 426/1261 [22:29<43:47,  3.15s/it]
 34%|███▍      | 427/1261 [22:32<43:43,  3.15s/it]
 34%|███▍      | 428/1261 [22:35<43:32,  3.14s/it]
 34%|███▍      | 429/1261 [22:38<43:27,  3.13s/it]
 34%|███▍      | 430/1261 [22:41<43:22,  3.13s/it]
 34%|███▍      | 431/1261 [22:44<43:17,  3.13s/it]
 34%|███▍      | 432/1261 [22:47<43:12,  3.13s/it]
 34%|███▍      | 433/1261 [22:51<43:06,  3.12s/it]
 34%|███▍      | 434/1261 [22:54<44:02,  3.20s/it]
 34%|███▍      | 435/1261 [22:57<45:01,  3.27s/it]
 35%|███▍      | 436/1261 [23:01<44:46,  3.26s/it]
 35%|███▍      | 437/1261 [23:04<44:47,  3.26s/it]
 35%|███▍      | 438/1261 [23:07<44:31,  3.25s/it]
 35%|███▍      | 439/1261 [23:10<45:02,  3.29s/it]
 35%|███▍      | 440/1261 [23:14<44:52,  3.28s/it]
 35%|███▍      | 441/1261 [23:17<45:15,  3.31s/it]
 35%|███▌      | 442/1261 [23:21<46:11,  3.38s/it]
 35%|███▌      | 443/1261 [23:24<47:52,  3.51s/it]
 35%|███▌      | 444/1261 [23:28<46:23,  3.41s/it]
 35%|███▌      | 445/1261 [23:31<45:24,  3.34s/it]
 35%|███▌      | 446/1261 [23:34<45:52,  3.38s/it]
 35%|███▌      | 447/1261 [23:38<46:13,  3.41s/it]
 36%|███▌      | 448/1261 [23:41<45:30,  3.36s/it]
 36%|███▌      | 449/1261 [23:44<44:32,  3.29s/it]
 36%|███▌      | 450/1261 [23:47<44:09,  3.27s/it]
 36%|███▌      | 451/1261 [23:51<45:43,  3.39s/it]
 36%|███▌      | 452/1261 [23:54<44:44,  3.32s/it]
 36%|███▌      | 453/1261 [23:57<44:05,  3.27s/it]
 36%|███▌      | 454/1261 [24:00<43:30,  3.24s/it]
 36%|███▌      | 455/1261 [24:04<43:00,  3.20s/it]
 36%|███▌      | 456/1261 [24:07<42:42,  3.18s/it]
 36%|███▌      | 457/1261 [24:10<42:23,  3.16s/it]
 36%|███▋      | 458/1261 [24:13<42:12,  3.15s/it]
 36%|███▋      | 459/1261 [24:16<42:06,  3.15s/it]
 36%|███▋      | 460/1261 [24:19<41:57,  3.14s/it]
 37%|███▋      | 461/1261 [24:22<41:50,  3.14s/it]
 37%|███▋      | 462/1261 [24:26<41:46,  3.14s/it]
 37%|███▋      | 463/1261 [24:29<41:41,  3.13s/it]
 37%|███▋      | 464/1261 [24:32<43:22,  3.27s/it]
 37%|███▋      | 465/1261 [24:36<44:01,  3.32s/it]
 37%|███▋      | 466/1261 [24:39<43:20,  3.27s/it]
 37%|███▋      | 467/1261 [24:42<42:44,  3.23s/it]
 37%|███▋      | 468/1261 [24:45<42:24,  3.21s/it]
 37%|███▋      | 469/1261 [24:48<42:01,  3.18s/it]
 37%|███▋      | 470/1261 [24:52<42:44,  3.24s/it]
 37%|███▋      | 471/1261 [24:55<42:25,  3.22s/it]
 37%|███▋      | 472/1261 [24:58<41:59,  3.19s/it]
 38%|███▊      | 473/1261 [25:01<41:47,  3.18s/it]
 38%|███▊      | 474/1261 [25:04<41:39,  3.18s/it]
 38%|███▊      | 475/1261 [25:07<41:23,  3.16s/it]
 38%|███▊      | 476/1261 [25:10<41:11,  3.15s/it]
 38%|███▊      | 477/1261 [25:14<40:59,  3.14s/it]
 38%|███▊      | 478/1261 [25:17<40:54,  3.14s/it]
 38%|███▊      | 479/1261 [25:20<40:43,  3.12s/it]
 38%|███▊      | 480/1261 [25:23<40:44,  3.13s/it]
 38%|███▊      | 481/1261 [25:26<40:37,  3.13s/it]
 38%|███▊      | 482/1261 [25:29<40:28,  3.12s/it]
 38%|███▊      | 483/1261 [25:32<40:31,  3.12s/it]
 38%|███▊      | 484/1261 [25:35<40:35,  3.13s/it]
 38%|███▊      | 485/1261 [25:39<40:32,  3.13s/it]
 39%|███▊      | 486/1261 [25:42<40:32,  3.14s/it]
 39%|███▊      | 487/1261 [25:45<40:24,  3.13s/it]
 39%|███▊      | 488/1261 [25:48<40:17,  3.13s/it]
 39%|███▉      | 489/1261 [25:51<40:13,  3.13s/it]
 39%|███▉      | 490/1261 [25:54<40:09,  3.13s/it]
 39%|███▉      | 491/1261 [25:57<40:04,  3.12s/it]
 39%|███▉      | 492/1261 [26:00<40:02,  3.12s/it]
 39%|███▉      | 493/1261 [26:04<40:03,  3.13s/it]
 39%|███▉      | 494/1261 [26:07<39:58,  3.13s/it]
 39%|███▉      | 495/1261 [26:10<39:54,  3.13s/it]
 39%|███▉      | 496/1261 [26:13<39:55,  3.13s/it]
 39%|███▉      | 497/1261 [26:16<39:49,  3.13s/it]
 39%|███▉      | 498/1261 [26:19<39:44,  3.12s/it]
 40%|███▉      | 499/1261 [26:22<39:39,  3.12s/it]
 40%|███▉      | 500/1261 [26:25<39:34,  3.12s/it]
 40%|███▉      | 501/1261 [26:29<39:37,  3.13s/it]
 40%|███▉      | 502/1261 [26:32<39:28,  3.12s/it]
 40%|███▉      | 503/1261 [26:35<39:26,  3.12s/it]
 40%|███▉      | 504/1261 [26:38<39:31,  3.13s/it]
 40%|████      | 505/1261 [26:41<39:27,  3.13s/it]
 40%|████      | 506/1261 [26:44<39:25,  3.13s/it]
 40%|████      | 507/1261 [26:47<39:29,  3.14s/it]
 40%|████      | 508/1261 [26:51<39:49,  3.17s/it]
 40%|████      | 509/1261 [26:54<40:52,  3.26s/it]
 40%|████      | 510/1261 [26:57<40:23,  3.23s/it]
 41%|████      | 511/1261 [27:00<40:00,  3.20s/it]
 41%|████      | 512/1261 [27:04<39:50,  3.19s/it]
 41%|████      | 513/1261 [27:07<39:29,  3.17s/it]
 41%|████      | 514/1261 [27:10<39:14,  3.15s/it]
 41%|████      | 515/1261 [27:13<39:01,  3.14s/it]
 41%|████      | 516/1261 [27:16<38:59,  3.14s/it]
 41%|████      | 517/1261 [27:19<38:48,  3.13s/it]
 41%|████      | 518/1261 [27:22<38:48,  3.13s/it]
 41%|████      | 519/1261 [27:25<38:44,  3.13s/it]
 41%|████      | 520/1261 [27:29<38:42,  3.13s/it]
 41%|████▏     | 521/1261 [27:32<38:37,  3.13s/it]
 41%|████▏     | 522/1261 [27:35<38:28,  3.12s/it]
 41%|████▏     | 523/1261 [27:38<38:24,  3.12s/it]
 42%|████▏     | 524/1261 [27:41<38:24,  3.13s/it]
 42%|████▏     | 525/1261 [27:44<38:14,  3.12s/it]
 42%|████▏     | 526/1261 [27:47<38:12,  3.12s/it]
 42%|████▏     | 527/1261 [27:50<38:03,  3.11s/it]
 42%|████▏     | 528/1261 [27:54<38:01,  3.11s/it]
 42%|████▏     | 529/1261 [27:57<37:59,  3.11s/it]
 42%|████▏     | 530/1261 [28:00<37:57,  3.12s/it]
 42%|████▏     | 531/1261 [28:03<37:57,  3.12s/it]
 42%|████▏     | 532/1261 [28:06<37:53,  3.12s/it]
 42%|████▏     | 533/1261 [28:09<37:51,  3.12s/it]
 42%|████▏     | 534/1261 [28:12<37:44,  3.11s/it]
 42%|████▏     | 535/1261 [28:15<37:46,  3.12s/it]
 43%|████▎     | 536/1261 [28:19<37:56,  3.14s/it]
 43%|████▎     | 537/1261 [28:22<38:30,  3.19s/it]
 43%|████▎     | 538/1261 [28:25<38:17,  3.18s/it]
 43%|████▎     | 539/1261 [28:28<38:10,  3.17s/it]
 43%|████▎     | 540/1261 [28:31<37:54,  3.16s/it]
 43%|████▎     | 541/1261 [28:34<37:55,  3.16s/it]
 43%|████▎     | 542/1261 [28:38<37:55,  3.16s/it]
 43%|████▎     | 543/1261 [28:41<37:42,  3.15s/it]
 43%|████▎     | 544/1261 [28:44<37:36,  3.15s/it]
 43%|████▎     | 545/1261 [28:47<37:35,  3.15s/it]
 43%|████▎     | 546/1261 [28:50<37:30,  3.15s/it]
 43%|████▎     | 547/1261 [28:54<38:06,  3.20s/it]
 43%|████▎     | 548/1261 [28:57<38:32,  3.24s/it]
 44%|████▎     | 549/1261 [29:00<38:13,  3.22s/it]
 44%|████▎     | 550/1261 [29:03<37:49,  3.19s/it]
 44%|████▎     | 551/1261 [29:06<37:42,  3.19s/it]
 44%|████▍     | 552/1261 [29:09<37:28,  3.17s/it]
 44%|████▍     | 553/1261 [29:13<37:16,  3.16s/it]
 44%|████▍     | 554/1261 [29:16<37:11,  3.16s/it]
 44%|████▍     | 555/1261 [29:19<37:09,  3.16s/it]
 44%|████▍     | 556/1261 [29:22<37:06,  3.16s/it]
 44%|████▍     | 557/1261 [29:25<37:03,  3.16s/it]
 44%|████▍     | 558/1261 [29:28<36:59,  3.16s/it]
 44%|████▍     | 559/1261 [29:32<36:56,  3.16s/it]
 44%|████▍     | 560/1261 [29:35<36:49,  3.15s/it]
 44%|████▍     | 561/1261 [29:38<36:49,  3.16s/it]
 45%|████▍     | 562/1261 [29:41<36:46,  3.16s/it]
 45%|████▍     | 563/1261 [29:44<36:46,  3.16s/it]
 45%|████▍     | 564/1261 [29:47<36:37,  3.15s/it]
 45%|████▍     | 565/1261 [29:50<36:37,  3.16s/it]
 45%|████▍     | 566/1261 [29:54<36:31,  3.15s/it]
 45%|████▍     | 567/1261 [29:57<36:24,  3.15s/it]
 45%|████▌     | 568/1261 [30:00<36:19,  3.14s/it]
 45%|████▌     | 569/1261 [30:03<36:13,  3.14s/it]
 45%|████▌     | 570/1261 [30:06<36:09,  3.14s/it]
 45%|████▌     | 571/1261 [30:09<36:06,  3.14s/it]
 45%|████▌     | 572/1261 [30:12<36:06,  3.14s/it]
 45%|████▌     | 573/1261 [30:16<36:00,  3.14s/it]
 46%|████▌     | 574/1261 [30:19<35:53,  3.13s/it]
 46%|████▌     | 575/1261 [30:22<35:51,  3.14s/it]
 46%|████▌     | 576/1261 [30:25<35:50,  3.14s/it]
 46%|████▌     | 577/1261 [30:28<35:46,  3.14s/it]
 46%|████▌     | 578/1261 [30:31<35:43,  3.14s/it]
 46%|████▌     | 579/1261 [30:34<35:39,  3.14s/it]
 46%|████▌     | 580/1261 [30:38<35:40,  3.14s/it]
 46%|████▌     | 581/1261 [30:41<35:35,  3.14s/it]
 46%|████▌     | 582/1261 [30:44<35:32,  3.14s/it]
 46%|████▌     | 583/1261 [30:47<35:29,  3.14s/it]
 46%|████▋     | 584/1261 [30:50<35:26,  3.14s/it]
 46%|████▋     | 585/1261 [30:53<36:01,  3.20s/it]
 46%|████▋     | 586/1261 [30:57<35:48,  3.18s/it]
 47%|████▋     | 587/1261 [31:00<35:39,  3.17s/it]
 47%|████▋     | 588/1261 [31:03<35:23,  3.16s/it]
 47%|████▋     | 589/1261 [31:06<35:15,  3.15s/it]
 47%|████▋     | 590/1261 [31:09<35:17,  3.16s/it]
 47%|████▋     | 591/1261 [31:12<35:13,  3.15s/it]
 47%|████▋     | 592/1261 [31:16<35:14,  3.16s/it]
 47%|████▋     | 593/1261 [31:19<35:06,  3.15s/it]
 47%|████▋     | 594/1261 [31:22<36:34,  3.29s/it]
 47%|████▋     | 595/1261 [31:26<37:09,  3.35s/it]
 47%|████▋     | 596/1261 [31:29<36:33,  3.30s/it]
 47%|████▋     | 597/1261 [31:32<36:01,  3.26s/it]
 47%|████▋     | 598/1261 [31:35<35:30,  3.21s/it]
 48%|████▊     | 599/1261 [31:38<35:07,  3.18s/it]
 48%|████▊     | 600/1261 [31:41<34:52,  3.17s/it]
 48%|████▊     | 601/1261 [31:45<34:37,  3.15s/it]
 48%|████▊     | 602/1261 [31:48<34:25,  3.13s/it]
 48%|████▊     | 603/1261 [31:51<34:18,  3.13s/it]
 48%|████▊     | 604/1261 [31:54<34:25,  3.14s/it]
 48%|████▊     | 605/1261 [31:57<34:20,  3.14s/it]
 48%|████▊     | 606/1261 [32:00<34:22,  3.15s/it]
 48%|████▊     | 607/1261 [32:03<34:16,  3.15s/it]
 48%|████▊     | 608/1261 [32:06<34:08,  3.14s/it]
 48%|████▊     | 609/1261 [32:10<33:59,  3.13s/it]
 48%|████▊     | 610/1261 [32:13<34:01,  3.14s/it]
 48%|████▊     | 611/1261 [32:16<33:51,  3.13s/it]
 49%|████▊     | 612/1261 [32:19<33:45,  3.12s/it]
 49%|████▊     | 613/1261 [32:22<33:40,  3.12s/it]
 49%|████▊     | 614/1261 [32:25<33:41,  3.12s/it]
 49%|████▉     | 615/1261 [32:28<33:38,  3.12s/it]
 49%|████▉     | 616/1261 [32:31<33:30,  3.12s/it]
 49%|████▉     | 617/1261 [32:35<33:26,  3.12s/it]
 49%|████▉     | 618/1261 [32:38<33:37,  3.14s/it]
 49%|████▉     | 619/1261 [32:41<34:04,  3.18s/it]
 49%|████▉     | 620/1261 [32:44<33:51,  3.17s/it]
 49%|████▉     | 621/1261 [32:47<33:37,  3.15s/it]
 49%|████▉     | 622/1261 [32:50<33:25,  3.14s/it]
 49%|████▉     | 623/1261 [32:54<34:01,  3.20s/it]
 49%|████▉     | 624/1261 [32:57<33:42,  3.17s/it]
 50%|████▉     | 625/1261 [33:00<33:32,  3.16s/it]
 50%|████▉     | 626/1261 [33:03<33:20,  3.15s/it]
 50%|████▉     | 627/1261 [33:06<33:08,  3.14s/it]
 50%|████▉     | 628/1261 [33:09<32:59,  3.13s/it]
 50%|████▉     | 629/1261 [33:12<33:00,  3.13s/it]
 50%|████▉     | 630/1261 [33:16<32:53,  3.13s/it]
 50%|█████     | 631/1261 [33:19<32:51,  3.13s/it]
 50%|█████     | 632/1261 [33:22<32:47,  3.13s/it]
 50%|█████     | 633/1261 [33:25<32:45,  3.13s/it]
 50%|█████     | 634/1261 [33:28<32:42,  3.13s/it]
 50%|█████     | 635/1261 [33:31<32:39,  3.13s/it]
 50%|█████     | 636/1261 [33:34<32:42,  3.14s/it]
 51%|█████     | 637/1261 [33:37<32:30,  3.13s/it]
 51%|█████     | 638/1261 [33:41<32:25,  3.12s/it]
 51%|█████     | 639/1261 [33:44<32:22,  3.12s/it]
 51%|█████     | 640/1261 [33:47<32:21,  3.13s/it]
 51%|█████     | 641/1261 [33:50<32:13,  3.12s/it]
 51%|█████     | 642/1261 [33:53<32:08,  3.12s/it]
 51%|█████     | 643/1261 [33:56<32:04,  3.11s/it]
 51%|█████     | 644/1261 [33:59<32:09,  3.13s/it]
 51%|█████     | 645/1261 [34:02<32:01,  3.12s/it]
 51%|█████     | 646/1261 [34:06<31:59,  3.12s/it]
 51%|█████▏    | 647/1261 [34:09<32:01,  3.13s/it]
 51%|█████▏    | 648/1261 [34:12<31:58,  3.13s/it]
 51%|█████▏    | 649/1261 [34:15<31:53,  3.13s/it]
 52%|█████▏    | 650/1261 [34:18<31:53,  3.13s/it]
 52%|█████▏    | 651/1261 [34:21<31:52,  3.13s/it]
 52%|█████▏    | 652/1261 [34:24<31:50,  3.14s/it]
 52%|█████▏    | 653/1261 [34:28<31:48,  3.14s/it]
 52%|█████▏    | 654/1261 [34:31<31:40,  3.13s/it]
 52%|█████▏    | 655/1261 [34:34<31:34,  3.13s/it]
 52%|█████▏    | 656/1261 [34:37<31:29,  3.12s/it]
 52%|█████▏    | 657/1261 [34:40<31:30,  3.13s/it]
 52%|█████▏    | 658/1261 [34:43<31:28,  3.13s/it]
 52%|█████▏    | 659/1261 [34:46<31:23,  3.13s/it]
 52%|█████▏    | 660/1261 [34:49<31:19,  3.13s/it]
 52%|█████▏    | 661/1261 [34:53<32:02,  3.20s/it]
 52%|█████▏    | 662/1261 [34:56<31:47,  3.19s/it]
 53%|█████▎    | 663/1261 [34:59<31:38,  3.18s/it]
 53%|█████▎    | 664/1261 [35:02<31:25,  3.16s/it]
 53%|█████▎    | 665/1261 [35:05<31:15,  3.15s/it]
 53%|█████▎    | 666/1261 [35:08<31:09,  3.14s/it]
 53%|█████▎    | 667/1261 [35:12<31:06,  3.14s/it]
 53%|█████▎    | 668/1261 [35:15<31:04,  3.14s/it]
 53%|█████▎    | 669/1261 [35:18<30:58,  3.14s/it]
 53%|█████▎    | 670/1261 [35:21<30:52,  3.14s/it]
 53%|█████▎    | 671/1261 [35:24<30:51,  3.14s/it]
 53%|█████▎    | 672/1261 [35:27<30:45,  3.13s/it]
 53%|█████▎    | 673/1261 [35:30<30:44,  3.14s/it]
 53%|█████▎    | 674/1261 [35:34<30:40,  3.13s/it]
 54%|█████▎    | 675/1261 [35:37<30:35,  3.13s/it]
 54%|█████▎    | 676/1261 [35:40<30:29,  3.13s/it]
 54%|█████▎    | 677/1261 [35:43<30:25,  3.13s/it]
 54%|█████▍    | 678/1261 [35:46<30:21,  3.12s/it]
 54%|█████▍    | 679/1261 [35:49<30:18,  3.13s/it]
 54%|█████▍    | 680/1261 [35:52<30:17,  3.13s/it]
 54%|█████▍    | 681/1261 [35:55<30:28,  3.15s/it]
 54%|█████▍    | 682/1261 [35:59<30:18,  3.14s/it]
 54%|█████▍    | 683/1261 [36:02<30:09,  3.13s/it]
 54%|█████▍    | 684/1261 [36:05<30:04,  3.13s/it]
 54%|█████▍    | 685/1261 [36:08<30:01,  3.13s/it]
 54%|█████▍    | 686/1261 [36:11<30:31,  3.19s/it]
 54%|█████▍    | 687/1261 [36:14<30:24,  3.18s/it]
 55%|█████▍    | 688/1261 [36:18<30:13,  3.16s/it]
 55%|█████▍    | 689/1261 [36:21<30:07,  3.16s/it]
 55%|█████▍    | 690/1261 [36:24<30:04,  3.16s/it]
 55%|█████▍    | 691/1261 [36:27<29:57,  3.15s/it]
 55%|█████▍    | 692/1261 [36:30<29:52,  3.15s/it]
 55%|█████▍    | 693/1261 [36:33<29:49,  3.15s/it]
 55%|█████▌    | 694/1261 [36:36<29:41,  3.14s/it]
 55%|█████▌    | 695/1261 [36:40<29:33,  3.13s/it]
 55%|█████▌    | 696/1261 [36:43<29:31,  3.13s/it]
 55%|█████▌    | 697/1261 [36:46<29:28,  3.14s/it]
 55%|█████▌    | 698/1261 [36:49<29:26,  3.14s/it]
 55%|█████▌    | 699/1261 [36:52<29:59,  3.20s/it]
 56%|█████▌    | 700/1261 [36:55<29:53,  3.20s/it]
 56%|█████▌    | 701/1261 [36:59<29:43,  3.19s/it]
 56%|█████▌    | 702/1261 [37:02<29:29,  3.17s/it]
 56%|█████▌    | 703/1261 [37:05<29:18,  3.15s/it]
 56%|█████▌    | 704/1261 [37:08<29:08,  3.14s/it]
 56%|█████▌    | 705/1261 [37:11<29:04,  3.14s/it]
 56%|█████▌    | 706/1261 [37:14<28:57,  3.13s/it]
 56%|█████▌    | 707/1261 [37:17<29:01,  3.14s/it]
 56%|█████▌    | 708/1261 [37:21<28:57,  3.14s/it]
 56%|█████▌    | 709/1261 [37:24<28:53,  3.14s/it]
 56%|█████▋    | 710/1261 [37:27<28:50,  3.14s/it]
 56%|█████▋    | 711/1261 [37:30<28:45,  3.14s/it]
 56%|█████▋    | 712/1261 [37:33<28:41,  3.14s/it]
 57%|█████▋    | 713/1261 [37:36<28:42,  3.14s/it]
 57%|█████▋    | 714/1261 [37:39<28:36,  3.14s/it]
 57%|█████▋    | 715/1261 [37:43<28:33,  3.14s/it]
 57%|█████▋    | 716/1261 [37:46<28:29,  3.14s/it]
 57%|█████▋    | 717/1261 [37:49<28:27,  3.14s/it]
 57%|█████▋    | 718/1261 [37:52<28:24,  3.14s/it]
 57%|█████▋    | 719/1261 [37:55<28:19,  3.13s/it]
 57%|█████▋    | 720/1261 [37:59<29:23,  3.26s/it]
 57%|█████▋    | 721/1261 [38:02<29:19,  3.26s/it]
 57%|█████▋    | 722/1261 [38:05<29:01,  3.23s/it]
 57%|█████▋    | 723/1261 [38:08<28:43,  3.20s/it]
 57%|█████▋    | 724/1261 [38:11<28:29,  3.18s/it]
 57%|█████▋    | 725/1261 [38:14<28:16,  3.17s/it]
 58%|█████▊    | 726/1261 [38:18<28:07,  3.15s/it]
 58%|█████▊    | 727/1261 [38:21<28:04,  3.15s/it]
 58%|█████▊    | 728/1261 [38:24<27:58,  3.15s/it]
 58%|█████▊    | 729/1261 [38:27<28:07,  3.17s/it]
 58%|█████▊    | 730/1261 [38:30<28:30,  3.22s/it]
 58%|█████▊    | 731/1261 [38:34<28:15,  3.20s/it]
 58%|█████▊    | 732/1261 [38:37<27:59,  3.17s/it]
 58%|█████▊    | 733/1261 [38:40<27:52,  3.17s/it]
 58%|█████▊    | 734/1261 [38:43<27:45,  3.16s/it]
 58%|█████▊    | 735/1261 [38:46<27:37,  3.15s/it]
 58%|█████▊    | 736/1261 [38:49<27:28,  3.14s/it]
 58%|█████▊    | 737/1261 [38:53<28:11,  3.23s/it]
 59%|█████▊    | 738/1261 [38:56<28:01,  3.22s/it]
 59%|█████▊    | 739/1261 [38:59<27:55,  3.21s/it]
 59%|█████▊    | 740/1261 [39:02<27:41,  3.19s/it]
 59%|█████▉    | 741/1261 [39:05<27:28,  3.17s/it]
 59%|█████▉    | 742/1261 [39:08<27:16,  3.15s/it]
 59%|█████▉    | 743/1261 [39:12<27:11,  3.15s/it]
 59%|█████▉    | 744/1261 [39:15<27:05,  3.14s/it]
 59%|█████▉    | 745/1261 [39:18<27:02,  3.15s/it]
 59%|█████▉    | 746/1261 [39:21<27:00,  3.15s/it]
 59%|█████▉    | 747/1261 [39:24<26:58,  3.15s/it]
 59%|█████▉    | 748/1261 [39:27<26:58,  3.15s/it]
 59%|█████▉    | 749/1261 [39:30<26:52,  3.15s/it]
 59%|█████▉    | 750/1261 [39:34<26:47,  3.15s/it]
 60%|█████▉    | 751/1261 [39:37<26:47,  3.15s/it]
 60%|█████▉    | 752/1261 [39:40<26:40,  3.14s/it]
 60%|█████▉    | 753/1261 [39:43<26:32,  3.14s/it]
 60%|█████▉    | 754/1261 [39:46<26:27,  3.13s/it]
 60%|█████▉    | 755/1261 [39:49<26:24,  3.13s/it]
 60%|█████▉    | 756/1261 [39:52<26:23,  3.13s/it]
 60%|██████    | 757/1261 [39:56<26:19,  3.13s/it]
 60%|██████    | 758/1261 [39:59<26:16,  3.13s/it]
 60%|██████    | 759/1261 [40:02<26:10,  3.13s/it]
 60%|██████    | 760/1261 [40:05<26:13,  3.14s/it]
 60%|██████    | 761/1261 [40:08<26:06,  3.13s/it]
 60%|██████    | 762/1261 [40:11<26:00,  3.13s/it]
 61%|██████    | 763/1261 [40:14<25:52,  3.12s/it]
 61%|██████    | 764/1261 [40:17<25:48,  3.12s/it]
 61%|██████    | 765/1261 [40:21<25:47,  3.12s/it]
 61%|██████    | 766/1261 [40:24<25:49,  3.13s/it]
 61%|██████    | 767/1261 [40:27<25:46,  3.13s/it]
 61%|██████    | 768/1261 [40:30<25:49,  3.14s/it]
 61%|██████    | 769/1261 [40:33<25:45,  3.14s/it]
 61%|██████    | 770/1261 [40:36<25:44,  3.15s/it]
 61%|██████    | 771/1261 [40:40<25:56,  3.18s/it]
 61%|██████    | 772/1261 [40:43<25:52,  3.18s/it]
 61%|██████▏   | 773/1261 [40:46<25:43,  3.16s/it]
 61%|██████▏   | 774/1261 [40:49<25:36,  3.16s/it]
 61%|██████▏   | 775/1261 [40:52<26:10,  3.23s/it]
 62%|██████▏   | 776/1261 [40:56<26:02,  3.22s/it]
 62%|██████▏   | 777/1261 [40:59<25:49,  3.20s/it]
 62%|██████▏   | 778/1261 [41:02<25:35,  3.18s/it]
 62%|██████▏   | 779/1261 [41:05<25:27,  3.17s/it]
 62%|██████▏   | 780/1261 [41:08<25:15,  3.15s/it]
 62%|██████▏   | 781/1261 [41:11<25:08,  3.14s/it]
 62%|██████▏   | 782/1261 [41:14<25:01,  3.13s/it]
 62%|██████▏   | 783/1261 [41:17<24:56,  3.13s/it]
 62%|██████▏   | 784/1261 [41:21<24:57,  3.14s/it]
 62%|██████▏   | 785/1261 [41:24<24:56,  3.14s/it]
 62%|██████▏   | 786/1261 [41:27<24:48,  3.13s/it]
 62%|██████▏   | 787/1261 [41:30<24:44,  3.13s/it]
 62%|██████▏   | 788/1261 [41:33<24:41,  3.13s/it]
 63%|██████▎   | 789/1261 [41:36<24:40,  3.14s/it]
 63%|██████▎   | 790/1261 [41:40<24:52,  3.17s/it]
 63%|██████▎   | 791/1261 [41:43<24:46,  3.16s/it]
 63%|██████▎   | 792/1261 [41:46<24:39,  3.15s/it]
 63%|██████▎   | 793/1261 [41:49<24:29,  3.14s/it]
 63%|██████▎   | 794/1261 [41:52<24:32,  3.15s/it]
 63%|██████▎   | 795/1261 [41:55<24:23,  3.14s/it]
 63%|██████▎   | 796/1261 [41:58<24:21,  3.14s/it]
 63%|██████▎   | 797/1261 [42:02<24:17,  3.14s/it]
 63%|██████▎   | 798/1261 [42:05<24:10,  3.13s/it]
 63%|██████▎   | 799/1261 [42:08<24:04,  3.13s/it]
 63%|██████▎   | 800/1261 [42:11<24:01,  3.13s/it]
 64%|██████▎   | 801/1261 [42:14<24:04,  3.14s/it]
 64%|██████▎   | 802/1261 [42:17<24:00,  3.14s/it]
 64%|██████▎   | 803/1261 [42:20<23:59,  3.14s/it]
 64%|██████▍   | 804/1261 [42:23<24:00,  3.15s/it]
 64%|██████▍   | 805/1261 [42:27<23:51,  3.14s/it]
 64%|██████▍   | 806/1261 [42:30<23:49,  3.14s/it]
 64%|██████▍   | 807/1261 [42:33<23:43,  3.14s/it]
 64%|██████▍   | 808/1261 [42:36<23:43,  3.14s/it]
 64%|██████▍   | 809/1261 [42:39<23:41,  3.14s/it]
 64%|██████▍   | 810/1261 [42:42<23:36,  3.14s/it]
 64%|██████▍   | 811/1261 [42:46<23:58,  3.20s/it]
 64%|██████▍   | 812/1261 [42:49<23:49,  3.18s/it]
 64%|██████▍   | 813/1261 [42:52<24:11,  3.24s/it]
 65%|██████▍   | 814/1261 [42:55<24:05,  3.23s/it]
 65%|██████▍   | 815/1261 [42:59<23:53,  3.21s/it]
 65%|██████▍   | 816/1261 [43:02<23:44,  3.20s/it]
 65%|██████▍   | 817/1261 [43:05<23:28,  3.17s/it]
 65%|██████▍   | 818/1261 [43:08<23:23,  3.17s/it]
 65%|██████▍   | 819/1261 [43:11<23:15,  3.16s/it]
 65%|██████▌   | 820/1261 [43:14<23:09,  3.15s/it]
 65%|██████▌   | 821/1261 [43:17<23:07,  3.15s/it]
 65%|██████▌   | 822/1261 [43:21<22:59,  3.14s/it]
 65%|██████▌   | 823/1261 [43:24<23:00,  3.15s/it]
 65%|██████▌   | 824/1261 [43:27<22:55,  3.15s/it]
 65%|██████▌   | 825/1261 [43:30<22:51,  3.15s/it]
 66%|██████▌   | 826/1261 [43:33<22:45,  3.14s/it]
 66%|██████▌   | 827/1261 [43:36<22:42,  3.14s/it]
 66%|██████▌   | 828/1261 [43:39<22:41,  3.14s/it]
 66%|██████▌   | 829/1261 [43:43<22:37,  3.14s/it]
 66%|██████▌   | 830/1261 [43:46<22:35,  3.14s/it]
 66%|██████▌   | 831/1261 [43:49<22:30,  3.14s/it]
 66%|██████▌   | 832/1261 [43:52<22:33,  3.16s/it]
 66%|██████▌   | 833/1261 [43:55<22:30,  3.15s/it]
 66%|██████▌   | 834/1261 [43:58<22:25,  3.15s/it]
 66%|██████▌   | 835/1261 [44:01<22:19,  3.14s/it]
 66%|██████▋   | 836/1261 [44:05<22:13,  3.14s/it]
 66%|██████▋   | 837/1261 [44:08<22:07,  3.13s/it]
 66%|██████▋   | 838/1261 [44:11<22:04,  3.13s/it]
 67%|██████▋   | 839/1261 [44:14<22:01,  3.13s/it]
 67%|██████▋   | 840/1261 [44:17<21:58,  3.13s/it]
 67%|██████▋   | 841/1261 [44:20<21:56,  3.13s/it]
 67%|██████▋   | 842/1261 [44:23<21:55,  3.14s/it]
 67%|██████▋   | 843/1261 [44:27<22:28,  3.23s/it]
 67%|██████▋   | 844/1261 [44:30<23:25,  3.37s/it]
 67%|██████▋   | 845/1261 [44:34<22:55,  3.31s/it]
 67%|██████▋   | 846/1261 [44:37<22:34,  3.26s/it]
 67%|██████▋   | 847/1261 [44:40<22:13,  3.22s/it]
 67%|██████▋   | 848/1261 [44:43<21:59,  3.20s/it]
 67%|██████▋   | 849/1261 [44:46<21:49,  3.18s/it]
 67%|██████▋   | 850/1261 [44:49<21:41,  3.17s/it]
 67%|██████▋   | 851/1261 [44:53<22:15,  3.26s/it]
 68%|██████▊   | 852/1261 [44:56<22:12,  3.26s/it]
 68%|██████▊   | 853/1261 [44:59<21:59,  3.23s/it]
 68%|██████▊   | 854/1261 [45:02<21:45,  3.21s/it]
 68%|██████▊   | 855/1261 [45:06<21:33,  3.19s/it]
 68%|██████▊   | 856/1261 [45:09<21:24,  3.17s/it]
 68%|██████▊   | 857/1261 [45:12<21:20,  3.17s/it]
 68%|██████▊   | 858/1261 [45:15<21:13,  3.16s/it]
 68%|██████▊   | 859/1261 [45:18<21:08,  3.16s/it]
 68%|██████▊   | 860/1261 [45:21<21:05,  3.16s/it]
 68%|██████▊   | 861/1261 [45:24<20:59,  3.15s/it]
 68%|██████▊   | 862/1261 [45:28<20:55,  3.15s/it]
 68%|██████▊   | 863/1261 [45:31<20:51,  3.14s/it]
 69%|██████▊   | 864/1261 [45:34<20:47,  3.14s/it]
 69%|██████▊   | 865/1261 [45:37<20:42,  3.14s/it]
 69%|██████▊   | 866/1261 [45:40<20:36,  3.13s/it]
 69%|██████▉   | 867/1261 [45:43<20:32,  3.13s/it]
 69%|██████▉   | 868/1261 [45:46<20:44,  3.17s/it]
 69%|██████▉   | 869/1261 [45:50<20:48,  3.18s/it]
 69%|██████▉   | 870/1261 [45:53<20:41,  3.18s/it]
 69%|██████▉   | 871/1261 [45:56<20:34,  3.16s/it]
 69%|██████▉   | 872/1261 [45:59<20:26,  3.15s/it]
 69%|██████▉   | 873/1261 [46:02<20:20,  3.14s/it]
 69%|██████▉   | 874/1261 [46:05<20:16,  3.14s/it]
 69%|██████▉   | 875/1261 [46:08<20:10,  3.14s/it]
 69%|██████▉   | 876/1261 [46:12<20:05,  3.13s/it]
 70%|██████▉   | 877/1261 [46:15<20:04,  3.14s/it]
 70%|██████▉   | 878/1261 [46:18<20:01,  3.14s/it]
 70%|██████▉   | 879/1261 [46:21<19:58,  3.14s/it]
 70%|██████▉   | 880/1261 [46:24<19:56,  3.14s/it]
 70%|██████▉   | 881/1261 [46:27<19:50,  3.13s/it]
 70%|██████▉   | 882/1261 [46:30<19:47,  3.13s/it]
 70%|███████   | 883/1261 [46:34<20:06,  3.19s/it]
 70%|███████   | 884/1261 [46:37<20:07,  3.20s/it]
 70%|███████   | 885/1261 [46:40<19:57,  3.18s/it]
 70%|███████   | 886/1261 [46:43<19:47,  3.17s/it]
 70%|███████   | 887/1261 [46:46<19:47,  3.18s/it]
 70%|███████   | 888/1261 [46:50<19:42,  3.17s/it]
 70%|███████   | 889/1261 [46:53<20:02,  3.23s/it]
 71%|███████   | 890/1261 [46:56<19:54,  3.22s/it]
 71%|███████   | 891/1261 [46:59<19:41,  3.19s/it]
 71%|███████   | 892/1261 [47:02<19:37,  3.19s/it]
 71%|███████   | 893/1261 [47:06<19:29,  3.18s/it]
 71%|███████   | 894/1261 [47:09<19:35,  3.20s/it]
 71%|███████   | 895/1261 [47:12<19:33,  3.21s/it]
 71%|███████   | 896/1261 [47:15<19:22,  3.18s/it]
 71%|███████   | 897/1261 [47:18<19:11,  3.16s/it]
 71%|███████   | 898/1261 [47:22<19:07,  3.16s/it]
 71%|███████▏  | 899/1261 [47:25<19:02,  3.16s/it]
 71%|███████▏  | 900/1261 [47:28<18:59,  3.16s/it]
 71%|███████▏  | 901/1261 [47:31<18:55,  3.15s/it]
 72%|███████▏  | 902/1261 [47:34<18:54,  3.16s/it]
 72%|███████▏  | 903/1261 [47:37<18:49,  3.15s/it]
 72%|███████▏  | 904/1261 [47:40<18:48,  3.16s/it]
 72%|███████▏  | 905/1261 [47:44<18:45,  3.16s/it]
 72%|███████▏  | 906/1261 [47:47<18:39,  3.15s/it]
 72%|███████▏  | 907/1261 [47:50<18:33,  3.14s/it]
 72%|███████▏  | 908/1261 [47:53<18:31,  3.15s/it]
 72%|███████▏  | 909/1261 [47:56<18:27,  3.15s/it]
 72%|███████▏  | 910/1261 [47:59<18:25,  3.15s/it]
 72%|███████▏  | 911/1261 [48:02<18:19,  3.14s/it]
 72%|███████▏  | 912/1261 [48:06<18:14,  3.14s/it]
 72%|███████▏  | 913/1261 [48:09<18:12,  3.14s/it]
 72%|███████▏  | 914/1261 [48:12<18:08,  3.14s/it]
 73%|███████▎  | 915/1261 [48:15<18:07,  3.14s/it]
 73%|███████▎  | 916/1261 [48:18<18:01,  3.13s/it]
 73%|███████▎  | 917/1261 [48:21<17:58,  3.14s/it]
 73%|███████▎  | 918/1261 [48:24<17:55,  3.13s/it]
 73%|███████▎  | 919/1261 [48:28<17:52,  3.13s/it]
 73%|███████▎  | 920/1261 [48:31<17:48,  3.13s/it]
 73%|███████▎  | 921/1261 [48:34<17:46,  3.14s/it]
 73%|███████▎  | 922/1261 [48:37<17:44,  3.14s/it]
 73%|███████▎  | 923/1261 [48:40<17:39,  3.14s/it]
 73%|███████▎  | 924/1261 [48:43<17:38,  3.14s/it]
 73%|███████▎  | 925/1261 [48:46<17:34,  3.14s/it]
 73%|███████▎  | 926/1261 [48:50<17:32,  3.14s/it]
 74%|███████▎  | 927/1261 [48:53<17:53,  3.22s/it]
 74%|███████▎  | 928/1261 [48:56<17:43,  3.20s/it]
 74%|███████▎  | 929/1261 [48:59<17:38,  3.19s/it]
 74%|███████▍  | 930/1261 [49:02<17:33,  3.18s/it]
 74%|███████▍  | 931/1261 [49:06<17:27,  3.17s/it]
 74%|███████▍  | 932/1261 [49:09<17:19,  3.16s/it]
 74%|███████▍  | 933/1261 [49:12<17:17,  3.16s/it]
 74%|███████▍  | 934/1261 [49:15<17:14,  3.16s/it]
 74%|███████▍  | 935/1261 [49:18<17:09,  3.16s/it]
 74%|███████▍  | 936/1261 [49:21<17:04,  3.15s/it]
 74%|███████▍  | 937/1261 [49:24<17:01,  3.15s/it]
 74%|███████▍  | 938/1261 [49:28<16:58,  3.15s/it]
 74%|███████▍  | 939/1261 [49:31<16:54,  3.15s/it]
 75%|███████▍  | 940/1261 [49:34<16:49,  3.15s/it]
 75%|███████▍  | 941/1261 [49:37<16:47,  3.15s/it]
 75%|███████▍  | 942/1261 [49:40<16:44,  3.15s/it]
 75%|███████▍  | 943/1261 [49:43<16:41,  3.15s/it]
 75%|███████▍  | 944/1261 [49:46<16:37,  3.15s/it]
 75%|███████▍  | 945/1261 [49:50<16:30,  3.13s/it]
 75%|███████▌  | 946/1261 [49:53<16:28,  3.14s/it]
 75%|███████▌  | 947/1261 [49:56<16:25,  3.14s/it]
 75%|███████▌  | 948/1261 [49:59<16:23,  3.14s/it]
 75%|███████▌  | 949/1261 [50:02<16:20,  3.14s/it]
 75%|███████▌  | 950/1261 [50:05<16:19,  3.15s/it]
 75%|███████▌  | 951/1261 [50:09<16:18,  3.16s/it]
 75%|███████▌  | 952/1261 [50:12<16:12,  3.15s/it]
 76%|███████▌  | 953/1261 [50:15<16:07,  3.14s/it]
 76%|███████▌  | 954/1261 [50:18<16:03,  3.14s/it]
 76%|███████▌  | 955/1261 [50:21<16:00,  3.14s/it]
 76%|███████▌  | 956/1261 [50:24<15:57,  3.14s/it]
 76%|███████▌  | 957/1261 [50:27<15:53,  3.14s/it]
 76%|███████▌  | 958/1261 [50:31<16:09,  3.20s/it]
 76%|███████▌  | 959/1261 [50:34<16:05,  3.20s/it]
 76%|███████▌  | 960/1261 [50:37<15:56,  3.18s/it]
 76%|███████▌  | 961/1261 [50:40<15:52,  3.17s/it]
 76%|███████▋  | 962/1261 [50:43<15:45,  3.16s/it]
 76%|███████▋  | 963/1261 [50:46<15:42,  3.16s/it]
 76%|███████▋  | 964/1261 [50:50<15:35,  3.15s/it]
 77%|███████▋  | 965/1261 [50:53<15:52,  3.22s/it]
 77%|███████▋  | 966/1261 [50:56<15:44,  3.20s/it]
 77%|███████▋  | 967/1261 [50:59<15:37,  3.19s/it]
 77%|███████▋  | 968/1261 [51:02<15:30,  3.17s/it]
 77%|███████▋  | 969/1261 [51:06<15:26,  3.17s/it]
 77%|███████▋  | 970/1261 [51:09<15:21,  3.17s/it]
 77%|███████▋  | 971/1261 [51:12<15:20,  3.18s/it]
 77%|███████▋  | 972/1261 [51:15<15:17,  3.17s/it]
 77%|███████▋  | 973/1261 [51:18<15:12,  3.17s/it]
 77%|███████▋  | 974/1261 [51:21<15:15,  3.19s/it]
 77%|███████▋  | 975/1261 [51:25<15:09,  3.18s/it]
 77%|███████▋  | 976/1261 [51:28<15:05,  3.18s/it]
 77%|███████▋  | 977/1261 [51:31<15:00,  3.17s/it]
 78%|███████▊  | 978/1261 [51:34<14:53,  3.16s/it]
 78%|███████▊  | 979/1261 [51:37<14:48,  3.15s/it]
 78%|███████▊  | 980/1261 [51:40<14:42,  3.14s/it]
 78%|███████▊  | 981/1261 [51:43<14:38,  3.14s/it]
 78%|███████▊  | 982/1261 [51:47<14:36,  3.14s/it]
 78%|███████▊  | 983/1261 [51:50<14:30,  3.13s/it]
 78%|███████▊  | 984/1261 [51:53<14:27,  3.13s/it]
 78%|███████▊  | 985/1261 [51:56<14:25,  3.13s/it]
 78%|███████▊  | 986/1261 [51:59<14:25,  3.15s/it]
 78%|███████▊  | 987/1261 [52:02<14:20,  3.14s/it]
 78%|███████▊  | 988/1261 [52:05<14:19,  3.15s/it]
 78%|███████▊  | 989/1261 [52:09<14:13,  3.14s/it]
 79%|███████▊  | 990/1261 [52:12<14:11,  3.14s/it]
 79%|███████▊  | 991/1261 [52:15<14:09,  3.15s/it]
 79%|███████▊  | 992/1261 [52:18<14:05,  3.14s/it]
 79%|███████▊  | 993/1261 [52:21<14:03,  3.15s/it]
 79%|███████▉  | 994/1261 [52:24<14:04,  3.16s/it]
 79%|███████▉  | 995/1261 [52:28<13:58,  3.15s/it]
 79%|███████▉  | 996/1261 [52:31<13:56,  3.16s/it]
 79%|███████▉  | 997/1261 [52:34<13:54,  3.16s/it]
 79%|███████▉  | 998/1261 [52:37<13:51,  3.16s/it]
 79%|███████▉  | 999/1261 [52:40<13:47,  3.16s/it]
 79%|███████▉  | 1000/1261 [52:43<13:45,  3.16s/it]
 79%|███████▉  | 1001/1261 [52:46<13:41,  3.16s/it]
 79%|███████▉  | 1002/1261 [52:50<13:38,  3.16s/it]
 80%|███████▉  | 1003/1261 [52:53<13:52,  3.23s/it]
 80%|███████▉  | 1004/1261 [52:56<13:47,  3.22s/it]
 80%|███████▉  | 1005/1261 [52:59<13:40,  3.20s/it]
 80%|███████▉  | 1006/1261 [53:03<13:34,  3.19s/it]
 80%|███████▉  | 1007/1261 [53:06<13:30,  3.19s/it]
 80%|███████▉  | 1008/1261 [53:09<13:24,  3.18s/it]
 80%|████████  | 1009/1261 [53:12<13:20,  3.18s/it]
 80%|████████  | 1010/1261 [53:15<13:20,  3.19s/it]
 80%|████████  | 1011/1261 [53:18<13:16,  3.19s/it]
 80%|████████  | 1012/1261 [53:22<13:12,  3.18s/it]
 80%|████████  | 1013/1261 [53:25<13:11,  3.19s/it]
 80%|████████  | 1014/1261 [53:28<13:05,  3.18s/it]
 80%|████████  | 1015/1261 [53:31<13:02,  3.18s/it]
 81%|████████  | 1016/1261 [53:34<12:59,  3.18s/it]
 81%|████████  | 1017/1261 [53:38<12:55,  3.18s/it]
 81%|████████  | 1018/1261 [53:41<12:50,  3.17s/it]
 81%|████████  | 1019/1261 [53:44<12:47,  3.17s/it]
 81%|████████  | 1020/1261 [53:47<12:44,  3.17s/it]
 81%|████████  | 1021/1261 [53:50<12:38,  3.16s/it]
 81%|████████  | 1022/1261 [53:53<12:34,  3.16s/it]
 81%|████████  | 1023/1261 [53:57<12:32,  3.16s/it]
 81%|████████  | 1024/1261 [54:00<12:28,  3.16s/it]
 81%|████████▏ | 1025/1261 [54:03<12:24,  3.16s/it]
 81%|████████▏ | 1026/1261 [54:06<12:20,  3.15s/it]
 81%|████████▏ | 1027/1261 [54:09<12:18,  3.16s/it]
 82%|████████▏ | 1028/1261 [54:12<12:14,  3.15s/it]
 82%|████████▏ | 1029/1261 [54:15<12:13,  3.16s/it]
 82%|████████▏ | 1030/1261 [54:19<12:08,  3.16s/it]
 82%|████████▏ | 1031/1261 [54:22<12:04,  3.15s/it]
 82%|████████▏ | 1032/1261 [54:25<12:03,  3.16s/it]
 82%|████████▏ | 1033/1261 [54:28<11:59,  3.16s/it]
 82%|████████▏ | 1034/1261 [54:31<11:54,  3.15s/it]
 82%|████████▏ | 1035/1261 [54:34<11:50,  3.14s/it]
 82%|████████▏ | 1036/1261 [54:37<11:45,  3.14s/it]
 82%|████████▏ | 1037/1261 [54:41<11:41,  3.13s/it]
 82%|████████▏ | 1038/1261 [54:44<11:37,  3.13s/it]
 82%|████████▏ | 1039/1261 [54:47<11:37,  3.14s/it]
 82%|████████▏ | 1040/1261 [54:50<11:31,  3.13s/it]
 83%|████████▎ | 1041/1261 [54:53<11:43,  3.20s/it]
 83%|████████▎ | 1042/1261 [54:56<11:35,  3.18s/it]
 83%|████████▎ | 1043/1261 [55:00<11:31,  3.17s/it]
 83%|████████▎ | 1044/1261 [55:03<11:25,  3.16s/it]
 83%|████████▎ | 1045/1261 [55:06<11:18,  3.14s/it]
 83%|████████▎ | 1046/1261 [55:09<11:14,  3.14s/it]
 83%|████████▎ | 1047/1261 [55:12<11:12,  3.14s/it]
 83%|████████▎ | 1048/1261 [55:15<11:09,  3.14s/it]
 83%|████████▎ | 1049/1261 [55:18<11:06,  3.15s/it]
 83%|████████▎ | 1050/1261 [55:22<11:03,  3.14s/it]
 83%|████████▎ | 1051/1261 [55:25<11:00,  3.14s/it]
 83%|████████▎ | 1052/1261 [55:28<10:57,  3.15s/it]
 84%|████████▎ | 1053/1261 [55:31<10:54,  3.15s/it]
 84%|████████▎ | 1054/1261 [55:34<10:50,  3.14s/it]
 84%|████████▎ | 1055/1261 [55:37<10:47,  3.14s/it]
 84%|████████▎ | 1056/1261 [55:40<10:44,  3.14s/it]
 84%|████████▍ | 1057/1261 [55:44<10:42,  3.15s/it]
 84%|████████▍ | 1058/1261 [55:47<10:39,  3.15s/it]
 84%|████████▍ | 1059/1261 [55:50<10:35,  3.15s/it]
 84%|████████▍ | 1060/1261 [55:53<10:33,  3.15s/it]
 84%|████████▍ | 1061/1261 [55:56<10:30,  3.15s/it]
 84%|████████▍ | 1062/1261 [55:59<10:28,  3.16s/it]
 84%|████████▍ | 1063/1261 [56:02<10:24,  3.15s/it]
 84%|████████▍ | 1064/1261 [56:06<10:19,  3.14s/it]
 84%|████████▍ | 1065/1261 [56:09<10:14,  3.14s/it]
 85%|████████▍ | 1066/1261 [56:12<10:11,  3.14s/it]
 85%|████████▍ | 1067/1261 [56:15<10:08,  3.14s/it]
 85%|████████▍ | 1068/1261 [56:18<10:06,  3.14s/it]
 85%|████████▍ | 1069/1261 [56:21<10:03,  3.15s/it]
 85%|████████▍ | 1070/1261 [56:24<10:01,  3.15s/it]
 85%|████████▍ | 1071/1261 [56:28<09:57,  3.14s/it]
 85%|████████▌ | 1072/1261 [56:31<09:56,  3.15s/it]
 85%|████████▌ | 1073/1261 [56:34<09:53,  3.16s/it]
 85%|████████▌ | 1074/1261 [56:37<09:49,  3.15s/it]
 85%|████████▌ | 1075/1261 [56:40<09:46,  3.15s/it]
 85%|████████▌ | 1076/1261 [56:43<09:42,  3.15s/it]
 85%|████████▌ | 1077/1261 [56:47<09:39,  3.15s/it]
 85%|████████▌ | 1078/1261 [56:50<09:36,  3.15s/it]
 86%|████████▌ | 1079/1261 [56:53<09:47,  3.23s/it]
 86%|████████▌ | 1080/1261 [56:56<09:41,  3.21s/it]
 86%|████████▌ | 1081/1261 [56:59<09:33,  3.19s/it]
 86%|████████▌ | 1082/1261 [57:03<09:27,  3.17s/it]
 86%|████████▌ | 1083/1261 [57:06<09:23,  3.17s/it]
 86%|████████▌ | 1084/1261 [57:09<09:19,  3.16s/it]
 86%|████████▌ | 1085/1261 [57:12<09:15,  3.16s/it]
 86%|████████▌ | 1086/1261 [57:15<09:11,  3.15s/it]
 86%|████████▌ | 1087/1261 [57:18<09:08,  3.15s/it]
 86%|████████▋ | 1088/1261 [57:21<09:05,  3.16s/it]
 86%|████████▋ | 1089/1261 [57:25<09:01,  3.15s/it]
 86%|████████▋ | 1090/1261 [57:28<08:58,  3.15s/it]
 87%|████████▋ | 1091/1261 [57:31<08:55,  3.15s/it]
 87%|████████▋ | 1092/1261 [57:34<08:52,  3.15s/it]
 87%|████████▋ | 1093/1261 [57:37<08:51,  3.16s/it]
 87%|████████▋ | 1094/1261 [57:40<08:47,  3.16s/it]
 87%|████████▋ | 1095/1261 [57:44<08:44,  3.16s/it]
 87%|████████▋ | 1096/1261 [57:47<08:40,  3.15s/it]
 87%|████████▋ | 1097/1261 [57:50<08:36,  3.15s/it]
 87%|████████▋ | 1098/1261 [57:53<08:33,  3.15s/it]
 87%|████████▋ | 1099/1261 [57:56<08:39,  3.21s/it]
 87%|████████▋ | 1100/1261 [58:00<09:02,  3.37s/it]
 87%|████████▋ | 1101/1261 [58:03<08:50,  3.32s/it]
 87%|████████▋ | 1102/1261 [58:06<08:41,  3.28s/it]
 87%|████████▋ | 1103/1261 [58:10<08:31,  3.24s/it]
 88%|████████▊ | 1104/1261 [58:13<08:24,  3.21s/it]
 88%|████████▊ | 1105/1261 [58:16<08:19,  3.20s/it]
 88%|████████▊ | 1106/1261 [58:19<08:13,  3.18s/it]
 88%|████████▊ | 1107/1261 [58:22<08:10,  3.18s/it]
 88%|████████▊ | 1108/1261 [58:25<08:05,  3.17s/it]
 88%|████████▊ | 1109/1261 [58:29<08:01,  3.17s/it]
 88%|████████▊ | 1110/1261 [58:32<07:57,  3.16s/it]
 88%|████████▊ | 1111/1261 [58:35<07:54,  3.17s/it]
 88%|████████▊ | 1112/1261 [58:38<07:50,  3.16s/it]
 88%|████████▊ | 1113/1261 [58:41<07:47,  3.16s/it]
 88%|████████▊ | 1114/1261 [58:44<07:43,  3.15s/it]
 88%|████████▊ | 1115/1261 [58:47<07:40,  3.16s/it]
 89%|████████▊ | 1116/1261 [58:51<07:36,  3.15s/it]
 89%|████████▊ | 1117/1261 [58:54<07:43,  3.22s/it]
 89%|████████▊ | 1118/1261 [58:57<07:38,  3.21s/it]
 89%|████████▊ | 1119/1261 [59:00<07:35,  3.21s/it]
 89%|████████▉ | 1120/1261 [59:04<07:29,  3.19s/it]
 89%|████████▉ | 1121/1261 [59:07<07:25,  3.18s/it]
 89%|████████▉ | 1122/1261 [59:10<07:24,  3.20s/it]
 89%|████████▉ | 1123/1261 [59:13<07:18,  3.18s/it]
 89%|████████▉ | 1124/1261 [59:16<07:14,  3.17s/it]
 89%|████████▉ | 1125/1261 [59:19<07:09,  3.16s/it]
 89%|████████▉ | 1126/1261 [59:22<07:05,  3.15s/it]
 89%|████████▉ | 1127/1261 [59:26<07:02,  3.15s/it]
 89%|████████▉ | 1128/1261 [59:29<06:59,  3.15s/it]
 90%|████████▉ | 1129/1261 [59:32<06:55,  3.15s/it]
 90%|████████▉ | 1130/1261 [59:35<06:52,  3.15s/it]
 90%|████████▉ | 1131/1261 [59:38<06:49,  3.15s/it]
 90%|████████▉ | 1132/1261 [59:41<06:46,  3.15s/it]
 90%|████████▉ | 1133/1261 [59:45<06:43,  3.15s/it]
 90%|████████▉ | 1134/1261 [59:48<06:40,  3.15s/it]
 90%|█████████ | 1135/1261 [59:51<06:36,  3.15s/it]
 90%|█████████ | 1136/1261 [59:54<06:32,  3.14s/it]
 90%|█████████ | 1137/1261 [59:57<06:28,  3.13s/it]
 90%|█████████ | 1138/1261 [1:00:00<06:26,  3.14s/it]
 90%|█████████ | 1139/1261 [1:00:03<06:23,  3.14s/it]
 90%|█████████ | 1140/1261 [1:00:07<06:25,  3.18s/it]
 90%|█████████ | 1141/1261 [1:00:10<06:21,  3.18s/it]
 91%|█████████ | 1142/1261 [1:00:13<06:16,  3.17s/it]
 91%|█████████ | 1143/1261 [1:00:16<06:11,  3.15s/it]
 91%|█████████ | 1144/1261 [1:00:19<06:06,  3.14s/it]
 91%|█████████ | 1145/1261 [1:00:22<06:03,  3.13s/it]
 91%|█████████ | 1146/1261 [1:00:25<06:00,  3.14s/it]
 91%|█████████ | 1147/1261 [1:00:29<05:57,  3.14s/it]
 91%|█████████ | 1148/1261 [1:00:32<05:54,  3.14s/it]
 91%|█████████ | 1149/1261 [1:00:35<05:52,  3.14s/it]
 91%|█████████ | 1150/1261 [1:00:38<05:50,  3.15s/it]
 91%|█████████▏| 1151/1261 [1:00:41<05:45,  3.14s/it]
 91%|█████████▏| 1152/1261 [1:00:44<05:42,  3.14s/it]
 91%|█████████▏| 1153/1261 [1:00:47<05:38,  3.14s/it]
 92%|█████████▏| 1154/1261 [1:00:51<05:36,  3.14s/it]
 92%|█████████▏| 1155/1261 [1:00:54<05:39,  3.21s/it]
 92%|█████████▏| 1156/1261 [1:00:57<05:35,  3.19s/it]
 92%|█████████▏| 1157/1261 [1:01:00<05:30,  3.17s/it]
 92%|█████████▏| 1158/1261 [1:01:03<05:28,  3.19s/it]
 92%|█████████▏| 1159/1261 [1:01:07<05:23,  3.17s/it]
 92%|█████████▏| 1160/1261 [1:01:10<05:19,  3.16s/it]
 92%|█████████▏| 1161/1261 [1:01:13<05:15,  3.15s/it]
 92%|█████████▏| 1162/1261 [1:01:16<05:11,  3.15s/it]
 92%|█████████▏| 1163/1261 [1:01:19<05:08,  3.15s/it]
 92%|█████████▏| 1164/1261 [1:01:22<05:05,  3.15s/it]
 92%|█████████▏| 1165/1261 [1:01:25<05:02,  3.15s/it]
 92%|█████████▏| 1166/1261 [1:01:29<04:59,  3.15s/it]
 93%|█████████▎| 1167/1261 [1:01:32<04:55,  3.15s/it]
 93%|█████████▎| 1168/1261 [1:01:35<04:52,  3.14s/it]
 93%|█████████▎| 1169/1261 [1:01:38<04:49,  3.14s/it]
 93%|█████████▎| 1170/1261 [1:01:41<04:46,  3.14s/it]
 93%|█████████▎| 1171/1261 [1:01:44<04:42,  3.14s/it]
 93%|█████████▎| 1172/1261 [1:01:47<04:39,  3.14s/it]
 93%|█████████▎| 1173/1261 [1:01:51<04:36,  3.15s/it]
 93%|█████████▎| 1174/1261 [1:01:54<04:33,  3.14s/it]
 93%|█████████▎| 1175/1261 [1:01:57<04:30,  3.15s/it]
 93%|█████████▎| 1176/1261 [1:02:00<04:27,  3.15s/it]
 93%|█████████▎| 1177/1261 [1:02:03<04:23,  3.14s/it]
 93%|█████████▎| 1178/1261 [1:02:06<04:21,  3.14s/it]
 93%|█████████▎| 1179/1261 [1:02:09<04:17,  3.14s/it]
 94%|█████████▎| 1180/1261 [1:02:13<04:14,  3.15s/it]
 94%|█████████▎| 1181/1261 [1:02:16<04:11,  3.14s/it]
 94%|█████████▎| 1182/1261 [1:02:19<04:07,  3.14s/it]
 94%|█████████▍| 1183/1261 [1:02:22<04:05,  3.14s/it]
 94%|█████████▍| 1184/1261 [1:02:25<04:01,  3.14s/it]
 94%|█████████▍| 1185/1261 [1:02:28<03:58,  3.14s/it]
 94%|█████████▍| 1186/1261 [1:02:31<03:55,  3.14s/it]
 94%|█████████▍| 1187/1261 [1:02:35<03:52,  3.15s/it]
 94%|█████████▍| 1188/1261 [1:02:38<03:49,  3.15s/it]
 94%|█████████▍| 1189/1261 [1:02:41<03:46,  3.14s/it]
 94%|█████████▍| 1190/1261 [1:02:44<03:43,  3.15s/it]
 94%|█████████▍| 1191/1261 [1:02:47<03:40,  3.15s/it]
 95%|█████████▍| 1192/1261 [1:02:50<03:37,  3.15s/it]
 95%|█████████▍| 1193/1261 [1:02:54<03:39,  3.23s/it]
 95%|█████████▍| 1194/1261 [1:02:57<03:35,  3.22s/it]
 95%|█████████▍| 1195/1261 [1:03:00<03:31,  3.20s/it]
 95%|█████████▍| 1196/1261 [1:03:03<03:26,  3.18s/it]
 95%|█████████▍| 1197/1261 [1:03:06<03:22,  3.17s/it]
 95%|█████████▌| 1198/1261 [1:03:10<03:19,  3.16s/it]
 95%|█████████▌| 1199/1261 [1:03:13<03:16,  3.16s/it]
 95%|█████████▌| 1200/1261 [1:03:16<03:12,  3.16s/it]
 95%|█████████▌| 1201/1261 [1:03:19<03:08,  3.15s/it]
 95%|█████████▌| 1202/1261 [1:03:22<03:05,  3.14s/it]
 95%|█████████▌| 1203/1261 [1:03:25<03:02,  3.15s/it]
 95%|█████████▌| 1204/1261 [1:03:28<02:59,  3.15s/it]
 96%|█████████▌| 1205/1261 [1:03:32<02:56,  3.14s/it]
 96%|█████████▌| 1206/1261 [1:03:35<02:52,  3.14s/it]
 96%|█████████▌| 1207/1261 [1:03:38<02:49,  3.14s/it]
 96%|█████████▌| 1208/1261 [1:03:41<02:46,  3.14s/it]
 96%|█████████▌| 1209/1261 [1:03:44<02:42,  3.13s/it]
 96%|█████████▌| 1210/1261 [1:03:47<02:40,  3.14s/it]
 96%|█████████▌| 1211/1261 [1:03:50<02:37,  3.15s/it]
 96%|█████████▌| 1212/1261 [1:03:54<02:34,  3.15s/it]
 96%|█████████▌| 1213/1261 [1:03:57<02:31,  3.16s/it]
 96%|█████████▋| 1214/1261 [1:04:00<02:28,  3.15s/it]
 96%|█████████▋| 1215/1261 [1:04:03<02:26,  3.18s/it]
 96%|█████████▋| 1216/1261 [1:04:06<02:22,  3.17s/it]
 97%|█████████▋| 1217/1261 [1:04:09<02:19,  3.16s/it]
 97%|█████████▋| 1218/1261 [1:04:13<02:15,  3.16s/it]
 97%|█████████▋| 1219/1261 [1:04:16<02:12,  3.15s/it]
 97%|█████████▋| 1220/1261 [1:04:19<02:08,  3.14s/it]
 97%|█████████▋| 1221/1261 [1:04:22<02:05,  3.15s/it]
 97%|█████████▋| 1222/1261 [1:04:25<02:02,  3.15s/it]
 97%|█████████▋| 1223/1261 [1:04:28<01:59,  3.16s/it]
 97%|█████████▋| 1224/1261 [1:04:31<01:56,  3.15s/it]
 97%|█████████▋| 1225/1261 [1:04:35<01:53,  3.15s/it]
 97%|█████████▋| 1226/1261 [1:04:38<01:50,  3.15s/it]
 97%|█████████▋| 1227/1261 [1:04:41<01:49,  3.23s/it]
 97%|█████████▋| 1228/1261 [1:04:45<01:50,  3.36s/it]
 97%|█████████▋| 1229/1261 [1:04:48<01:45,  3.30s/it]
 98%|█████████▊| 1230/1261 [1:04:51<01:42,  3.32s/it]
 98%|█████████▊| 1231/1261 [1:04:55<01:38,  3.29s/it]
 98%|█████████▊| 1232/1261 [1:04:58<01:34,  3.25s/it]
 98%|█████████▊| 1233/1261 [1:05:01<01:30,  3.23s/it]
 98%|█████████▊| 1234/1261 [1:05:04<01:26,  3.20s/it]
 98%|█████████▊| 1235/1261 [1:05:07<01:22,  3.18s/it]
 98%|█████████▊| 1236/1261 [1:05:10<01:19,  3.17s/it]
 98%|█████████▊| 1237/1261 [1:05:14<01:16,  3.17s/it]
 98%|█████████▊| 1238/1261 [1:05:17<01:12,  3.16s/it]
 98%|█████████▊| 1239/1261 [1:05:20<01:10,  3.20s/it]
 98%|█████████▊| 1240/1261 [1:05:23<01:07,  3.19s/it]
 98%|█████████▊| 1241/1261 [1:05:26<01:03,  3.18s/it]
 98%|█████████▊| 1242/1261 [1:05:29<01:00,  3.17s/it]
 99%|█████████▊| 1243/1261 [1:05:33<00:56,  3.17s/it]
 99%|█████████▊| 1244/1261 [1:05:36<00:53,  3.15s/it]
 99%|█████████▊| 1245/1261 [1:05:39<00:50,  3.15s/it]
 99%|█████████▉| 1246/1261 [1:05:42<00:47,  3.15s/it]
 99%|█████████▉| 1247/1261 [1:05:45<00:44,  3.16s/it]
 99%|█████████▉| 1248/1261 [1:05:48<00:40,  3.15s/it]
 99%|█████████▉| 1249/1261 [1:05:51<00:37,  3.15s/it]
 99%|█████████▉| 1250/1261 [1:05:55<00:34,  3.15s/it]
 99%|█████████▉| 1251/1261 [1:05:58<00:31,  3.15s/it]
 99%|█████████▉| 1252/1261 [1:06:01<00:28,  3.14s/it]
 99%|█████████▉| 1253/1261 [1:06:04<00:25,  3.14s/it]
 99%|█████████▉| 1254/1261 [1:06:07<00:22,  3.15s/it]
100%|█████████▉| 1255/1261 [1:06:10<00:18,  3.15s/it]
100%|█████████▉| 1256/1261 [1:06:13<00:15,  3.15s/it]
100%|█████████▉| 1257/1261 [1:06:17<00:12,  3.15s/it]
100%|█████████▉| 1258/1261 [1:06:20<00:09,  3.14s/it]
100%|█████████▉| 1259/1261 [1:06:23<00:06,  3.14s/it]
100%|█████████▉| 1260/1261 [1:06:26<00:03,  3.15s/it]
[MoviePy] Done.
[MoviePy] >>>> Video ready: output_lane_vehicle_project_video.mp4 

In [ ]:
# Refs

https://docs.python.org/2/library/collections.html#collections.deque
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html
http://scikit-image.org/docs/dev/auto_examples/features_detection/plot_hog.html#id3
http://scikit-image.org/docs/dev/auto_examples/
http://udacity.com (Chapeters 35-38) from Vehicle detection chapter [code].
https://groups.google.com/forum/#!topic/pythonvision/AVrnueiKKYI
http://stanford.edu/~eadeli/publications/ISVC2007.pdf
https://chatbotslife.com/vehicle-detection-and-tracking-using-computer-vision-baea4df65906
https://pdfs.semanticscholar.org/2ce0/664cfcb32461b900dd9e889cbbb2259c503e.pdf
http://excel.fit.vutbr.cz/submissions/2016/004/4.pdf // Detecting vehicles using Gaussian Mixture.